Package elisa :: Package core :: Package tests :: Module test_plugin_registry
[hide private]
[frames] | no frames]

Source Code for Module elisa.core.tests.test_plugin_registry

  1  # Elisa - Home multimedia server 
  2  # Copyright (C) 2006-2008 Fluendo Embedded S.L. (www.fluendo.com). 
  3  # All rights reserved. 
  4  # 
  5  # This file is available under one of two license agreements. 
  6  # 
  7  # This file is licensed under the GPL version 3. 
  8  # See "LICENSE.GPL" in the root of this distribution including a special 
  9  # exception to use Elisa with Fluendo's plugins. 
 10  # 
 11  # The GPL part of Elisa is also available under a commercial licensing 
 12  # agreement from Fluendo. 
 13  # See "LICENSE.Elisa" in the root directory of this distribution package 
 14  # for details on that license. 
 15   
 16  from twisted.trial import unittest 
 17  from elisa.core.tests.elisa_test_case import ElisaTestCase 
 18  from elisa.core import plugin_registry 
 19  from elisa.core import config 
 20  from elisa.core import plugin 
 21  from elisa.core.component import Component, UnMetDependency 
 22  from elisa.base_components.activity import Activity 
 23  import inspect, os, platform 
 24  import tempfile, shutil 
 25  from twisted.internet import defer 
 26   
27 -class SomeActivity(Activity):
28 name = 'some_activity'
29
30 -class DeferredInitializeActivity(Activity):
31 name = 'deferred_initialize_activity' 32
33 - def initialize(self):
34 return defer.succeed(None)
35
36 -class SomePlugin(plugin.Plugin):
37 name = 'test' 38 components = { 39 'some_activity': {'path': SomeActivity}, 40 'deferred_initialize_activity': {'path': DeferredInitializeActivity} 41 }
42
43 -class FooPlugin(plugin.Plugin):
44 name = 'foo'
45
46 -class MissingDepsPlugin(plugin.Plugin):
47 name = 'missing_deps' 48 plugin_dependencies = ['unexistent_plugin'] 49 components = {'missing_deps_component': 50 {'path': 'fake:MissingDepsComponent', 51 'component_dependencies': ['unexistent_plugin:component']}, 52 'missing_external_deps_component': 53 {'path': 'fake:MissingDepsComponent', 54 'external_dependencies': ['fjezivfihahfue']} 55 }
56 57 SOME_PLUGIN="""\ 58 from elisa.core import plugin 59 from elisa.base_components import activity 60 61 class SomeActivity(activity.Activity): 62 name = 'some_activity' 63 64 class SomePlugin(plugin.Plugin): 65 name = 'test' 66 components = {'some_activity':{'path':SomeActivity}} 67 """ 68 69 FOO_PLUGIN="""\ 70 from elisa.core import plugin 71 72 class FooPlugin(plugin.Plugin): 73 name = 'foo' 74 """ 75
76 -class TestPluginRegistry(ElisaTestCase):
77 78
79 - def setUp(self):
80 ElisaTestCase.setUp(self) 81 self._plugins_dir = tempfile.mkdtemp()
82
83 - def tearDown(self):
84 ElisaTestCase.tearDown(self) 85 shutil.rmtree(self._plugins_dir)
86 87
88 - def test_plugin_registration(self):
89 """ Check plugin classes registering/unregistering works 90 """ 91 manager = plugin_registry.PluginRegistry(config.Config('empty.conf')) 92 93 self.assertEquals(manager.plugins, {}) 94 self.assertEquals(manager.plugin_classes, {}) 95 96 manager.register_plugin(SomePlugin) 97 self.assertEquals(manager.plugin_classes, {'test': SomePlugin}) 98 99 manager.unregister_plugin(SomePlugin) 100 self.assertEquals(manager.plugin_classes, {})
101
102 - def test_plugin_loading(self):
103 """ Check the plugins declared in the config are loaded 104 """ 105 106 if platform.system() == 'Windows': 107 raise unittest.SkipTest("Does not works under windows, need investigation") 108 109 conf = config.Config('empty.conf') 110 os.environ['ELISA_PLUGIN_PATH'] = self._plugins_dir 111 section = {'plugins':['test', 'foo']} 112 conf.set_section('plugin_registry', section) 113 114 init = os.path.join(self._plugins_dir, '__init__.py') 115 open(init,'w').close() 116 117 118 # write plugins code to files 119 f = open(os.path.join(self._plugins_dir, 'foo.py'),'w') 120 f.write(FOO_PLUGIN) 121 f.close() 122 123 f = open(os.path.join(self._plugins_dir, 'some.py'),'w') 124 f.write(SOME_PLUGIN) 125 f.close() 126 127 manager = plugin_registry.PluginRegistry(conf) 128 129 # load plugins from files 130 manager.load_plugins() 131 132 self.assertEquals(manager.plugins, {}) 133 plugins = manager.plugin_classes.keys() 134 self.failUnless('test' in plugins) 135 self.failUnless('foo' in plugins) 136 137 test_plugin = manager.plugin_classes['test'] 138 foo_plugin = manager.plugin_classes['foo'] 139 self.assertEquals(test_plugin.__name__, 'SomePlugin') 140 self.assertEquals(foo_plugin.__name__, 'FooPlugin')
141
143 """ Check Plugin instances are lazily referenced by the manager 144 """ 145 conf = config.Config('empty.conf') 146 manager = plugin_registry.PluginRegistry(conf) 147 manager.register_plugin(SomePlugin) 148 149 plugin1 = manager.get_plugin_with_name('test') 150 plugin2 = manager.get_plugin_with_name('test') 151 152 self.failUnless(isinstance(plugin1, SomePlugin)) 153 self.failUnless(plugin1 == plugin2)
154
156 """ Test several error cases of plugin instantiation. 157 """ 158 conf = config.Config('empty.conf') 159 manager = plugin_registry.PluginRegistry(conf) 160 161 manager.register_plugin(MissingDepsPlugin) 162 plugin = manager.get_plugin_with_name('missing_deps') 163 164 self.failUnless(isinstance(plugin, MissingDepsPlugin)) 165 166 self.failUnlessRaises(UnMetDependency, 167 manager.check_interplugin_dependencies, plugin) 168 169 self.failUnlessRaises(UnMetDependency, 170 manager.check_intercomponent_dependencies, 171 plugin, 'missing_deps_component')
172
173 - def test_component_creation(self):
174 """ Check Components are correctly instantiated by the manager 175 """ 176 conf = config.Config('empty.conf') 177 conf.set_option('activities', ['test:some_activity',], 178 'plugin_registry') 179 manager = plugin_registry.PluginRegistry(conf) 180 manager.register_plugin(SomePlugin) 181 182 activity = manager.create_component('test:some_activity') 183 self.failUnless(isinstance(activity, Activity)) 184 self.failUnless(isinstance(activity, SomeActivity))
185
187 """Check components that return a deferred from Component.initialize() 188 """ 189 conf = config.Config('empty.conf') 190 conf.set_option('activities', ['test:deferred_initialize_activity',], 191 'plugin_registry') 192 manager = plugin_registry.PluginRegistry(conf) 193 manager.register_plugin(SomePlugin) 194 195 def create_component_done(activity): 196 self.failUnless(isinstance(activity, Activity)) 197 self.failUnless(isinstance(activity, DeferredInitializeActivity))
198 199 dfr = manager.create_component('test:deferred_initialize_activity') 200 dfr.addCallback(create_component_done) 201 202 return dfr
203
204 - def test_component_creation_failures(self):
205 conf = config.Config('empty.conf') 206 manager = plugin_registry.PluginRegistry(conf) 207 208 manager.register_plugin(MissingDepsPlugin) 209 210 self.failUnlessRaises(UnMetDependency, 211 manager.create_component, 212 'missing_deps:missing_external_deps_component')
213
214 - def test_multiple_component_creation(self):
215 """ Check the manager can create multiple instance of the same component 216 """ 217 conf_activities = ['test:some_activity:1', 218 'test:some_activity:2'] 219 conf = config.Config('empty.conf') 220 conf.set_option('activities', conf_activities, 221 'plugin_registry') 222 manager = plugin_registry.PluginRegistry(conf) 223 manager.register_plugin(SomePlugin) 224 225 activities = [] 226 index = 1 227 for activity_path in conf_activities: 228 component = manager.create_component(activity_path) 229 self.assertEqual(component.id, index) 230 self.failUnless(isinstance(component, Activity)) 231 self.failUnless(isinstance(component, SomeActivity)) 232 index += 1 233 activities.append(component) 234 235 self.assertEqual(len(activities), 2)
236
237 - def test_create_component(self):
238 """ 239 """ 240 conf = config.Config('empty.conf') 241 conf.set_option('activities', ['test:some_activity:1', 242 'test:some_activity:2', 243 ], 244 'plugin_registry') 245 manager = plugin_registry.PluginRegistry(conf) 246 manager.register_plugin(SomePlugin) 247 248 act = manager.create_component('test:some_activity') 249 self.failUnless(act) 250 self.failUnless(isinstance(act, Activity)) 251 self.failUnless(isinstance(act, SomeActivity))
252
253 - def test_get_component_class(self):
254 """ 255 """ 256 conf = config.Config('empty.conf') 257 conf.set_option('activities', ['test:some_activity:1', 258 'test:some_activity:2', 259 ], 260 'plugin_registry') 261 manager = plugin_registry.PluginRegistry(conf) 262 manager.register_plugin(SomePlugin) 263 264 class App: 265 pass
266 267 app = App() 268 app.plugin_registry = manager 269 270 from elisa.core import common 271 common.set_application(app) 272 273 c = plugin_registry.get_component_class('test:some_activity') 274 self.failUnless(c) 275 self.failUnless(issubclass(c, Activity)) 276 self.assertEqual(c, SomeActivity) 277 278
279 - def test_split_component_path(self):
280 """ 281 """ 282 conf = config.Config('empty.conf') 283 conf.set_option('activities', ['test:some_activity:1', 284 'test:some_activity:2', 285 ], 286 'plugin_registry') 287 manager = plugin_registry.PluginRegistry(conf) 288 289 self.assertEqual((), manager._split_component_path('Invalid')) 290 self.assertEqual(('A', 'B', 0, 'A:B'), manager._split_component_path('A:B')) 291 self.assertEqual(('A', 'B', 1, 'A:B:1'), manager._split_component_path('A:B:1')) 292 self.assertEqual((), manager._split_component_path('A:B:c'))
293