1
# Copyright (C) 2006 Canonical Ltd
1
# Copyright (C) 2006, 2008-2012, 2016 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
39
41
a_registry = registry.Registry()
40
42
self.register_stuff(a_registry)
42
self.failUnless(a_registry.default_key is None)
44
self.assertTrue(a_registry.default_key is None)
44
46
# test get() (self.default_key is None)
45
47
self.assertRaises(KeyError, a_registry.get)
50
52
# test _set_default_key
51
53
a_registry.default_key = 'five'
52
self.failUnless(a_registry.default_key == 'five')
54
self.assertTrue(a_registry.default_key == 'five')
53
55
self.assertEqual(5, a_registry.get())
54
56
self.assertEqual(5, a_registry.get(None))
55
57
# If they ask for a specific entry, they should get KeyError
64
66
a_registry = registry.Registry()
65
67
self.register_stuff(a_registry)
67
self.failUnless('one' in a_registry)
69
self.assertTrue('one' in a_registry)
68
70
a_registry.remove('one')
69
self.failIf('one' in a_registry)
71
self.assertFalse('one' in a_registry)
70
72
self.assertRaises(KeyError, a_registry.get, 'one')
72
74
a_registry.register('one', 'one')
201
203
self.assertEqual('//baz/qux', suffix)
202
204
self.assertIs(sftp_object, found_object)
206
def test_registry_alias(self):
207
a_registry = registry.Registry()
208
a_registry.register('one', 1, info='string info')
209
a_registry.register_alias('two', 'one')
210
a_registry.register_alias('three', 'one', info='own info')
211
self.assertEqual(a_registry.get('one'), a_registry.get('two'))
212
self.assertEqual(a_registry.get_help('one'), a_registry.get_help('two'))
213
self.assertEqual(a_registry.get_info('one'), a_registry.get_info('two'))
214
self.assertEqual('own info', a_registry.get_info('three'))
215
self.assertEqual({'two': 'one', 'three': 'one'}, a_registry.aliases())
216
self.assertEqual({'one': ['three', 'two']},
217
{k: sorted(v) for (k, v) in viewitems(a_registry.alias_map())})
219
def test_registry_alias_exists(self):
220
a_registry = registry.Registry()
221
a_registry.register('one', 1, info='string info')
222
a_registry.register('two', 2)
223
self.assertRaises(KeyError, a_registry.register_alias, 'one', 'one')
225
def test_registry_alias_targetmissing(self):
226
a_registry = registry.Registry()
227
self.assertRaises(KeyError, a_registry.register_alias, 'one', 'two')
205
230
class TestRegistryIter(tests.TestCase):
206
231
"""Test registry iteration behaviors.
215
240
# We create a registry with "official" objects and "hidden"
216
241
# objects. The later represent the side effects that led to bug #277048
218
self.registry = registry.Registry()
243
_registry = registry.Registry()
220
245
def register_more():
221
self.registry.register('hidden', None)
246
_registry.register('hidden', None)
248
# Avoid closing over self by binding local variable
249
self.registry = _registry
223
250
self.registry.register('passive', None)
224
251
self.registry.register('active', register_more)
225
252
self.registry.register('passive-too', None)
229
256
def get_obj(inner_self):
230
257
# Surprise ! Getting a registered object (think lazy loaded
231
258
# module) register yet another object !
232
self.registry.register('more hidden', None)
259
_registry.register('more hidden', None)
233
260
return inner_self._obj
235
262
self.registry.register('hacky', None)
272
299
plugin_name = 'bzr_plugin_a_%s' % (osutils.rand_chars(4),)
273
open('tmp/'+plugin_name+'.py', 'wb').write(contents)
300
with open('tmp/'+plugin_name+'.py', 'wb') as f: f.write(contents)
274
301
return plugin_name
276
303
def create_simple_plugin(self):
316
def test_lazy_import_registry_foo(self):
317
a_registry = registry.Registry()
318
a_registry.register_lazy('foo', 'breezy.branch', 'Branch')
319
a_registry.register_lazy('bar', 'breezy.branch', 'Branch.hooks')
320
self.assertEqual(branch.Branch, a_registry.get('foo'))
321
self.assertEqual(branch.Branch.hooks, a_registry.get('bar'))
289
323
def test_lazy_import_registry(self):
290
324
plugin_name = self.create_simple_plugin()
291
325
a_registry = registry.Registry()
297
331
self.assertEqual(['function', 'klass', 'module', 'obj'],
298
332
sorted(a_registry.keys()))
299
333
# The plugin should not be loaded until we grab the first object
300
self.failIf(plugin_name in sys.modules)
334
self.assertFalse(plugin_name in sys.modules)
302
336
# By default the plugin won't be in the search path
303
337
self.assertRaises(ImportError, a_registry.get, 'obj')
305
plugin_path = os.getcwd() + '/tmp'
339
plugin_path = self.test_dir + '/tmp'
306
340
sys.path.append(plugin_path)
308
342
obj = a_registry.get('obj')
309
343
self.assertEqual('foo', obj)
310
self.failUnless(plugin_name in sys.modules)
344
self.assertTrue(plugin_name in sys.modules)
312
346
# Now grab another object
313
347
func = a_registry.get('function')
332
366
sys.path.remove(plugin_path)
368
def test_lazy_import_get_module(self):
369
a_registry = registry.Registry()
370
a_registry.register_lazy('obj', "breezy.tests.test_registry",
372
self.assertEqual("breezy.tests.test_registry",
373
a_registry._get_module("obj"))
375
def test_normal_get_module(self):
376
class AThing(object):
378
a_registry = registry.Registry()
379
a_registry.register("obj", AThing())
380
self.assertEqual("breezy.tests.test_registry",
381
a_registry._get_module("obj"))