24
24
from StringIO import StringIO
27
28
import bzrlib.plugin
28
29
import bzrlib.plugins
29
30
import bzrlib.commands
31
from bzrlib.tests import TestCaseInTempDir
32
from bzrlib.tests import TestCase, TestCaseInTempDir
32
33
from bzrlib.osutils import pathjoin, abspath
34
class PluginTest(TestCaseInTempDir):
35
"""Create an external plugin and test loading."""
36
# def test_plugin_loading(self):
37
# orig_help = self.run_bzr_captured('bzr help commands')[0]
38
# os.mkdir('plugin_test')
39
# f = open(pathjoin('plugin_test', 'myplug.py'), 'wt')
40
# f.write(PLUGIN_TEXT)
42
# newhelp = self.run_bzr_captured('bzr help commands')[0]
43
# assert newhelp.startswith('You have been overridden\n')
44
# # We added a line, but the rest should work
45
# assert newhelp[25:] == help
47
# assert backtick('bzr commit -m test') == "I'm sorry dave, you can't do that\n"
49
# shutil.rmtree('plugin_test')
52
# os.environ['BZRPLUGINPATH'] = abspath('plugin_test')
53
# help = backtick('bzr help commands')
54
# assert help.find('myplug') != -1
55
# assert help.find('Just a simple test plugin.') != -1
58
# assert backtick('bzr myplug') == 'Hello from my plugin\n'
59
# assert backtick('bzr mplg') == 'Hello from my plugin\n'
61
# f = open(pathjoin('plugin_test', 'override.py'), 'wb')
62
# f.write("""import bzrlib, bzrlib.commands
63
# class cmd_commit(bzrlib.commands.cmd_commit):
64
# '''Commit changes into a new revision.'''
65
# def run(self, *args, **kwargs):
66
# print "I'm sorry dave, you can't do that"
68
# class cmd_help(bzrlib.commands.cmd_help):
69
# '''Show help on a command or other topic.'''
70
# def run(self, *args, **kwargs):
71
# print "You have been overridden"
72
# bzrlib.commands.cmd_help.run(self, *args, **kwargs)
77
37
import bzrlib.commands
85
45
# TODO: Write a test for plugin decoration of commands.
87
class TestOneNamedPluginOnly(TestCaseInTempDir):
47
class TestLoadingPlugins(TestCaseInTempDir):
89
49
activeattributes = {}
91
51
def test_plugins_with_the_same_name_are_not_loaded(self):
92
# This test tests that having two plugins in different
93
# directories does not result in both being loaded.
94
# get a file name we can use which is also a valid attribute
95
# for accessing in activeattributes. - we cannot give import parameters.
52
# This test tests that having two plugins in different directories does
53
# not result in both being loaded when they have the same name. get a
54
# file name we can use which is also a valid attribute for accessing in
55
# activeattributes. - we cannot give import parameters.
96
56
tempattribute = "0"
97
57
self.failIf(tempattribute in self.activeattributes)
98
58
# set a place for the plugins to record their loading, and at the same
99
59
# time validate that the location the plugins should record to is
100
60
# valid and correct.
101
bzrlib.tests.test_plugins.TestOneNamedPluginOnly.activeattributes \
61
bzrlib.tests.test_plugins.TestLoadingPlugins.activeattributes \
102
62
[tempattribute] = []
103
63
self.failUnless(tempattribute in self.activeattributes)
104
64
# create two plugin directories
106
66
os.mkdir('second')
107
67
# write a plugin that will record when its loaded in the
108
68
# tempattribute list.
109
template = ("from bzrlib.tests.test_plugins import TestOneNamedPluginOnly\n"
110
"TestOneNamedPluginOnly.activeattributes[%r].append('%s')\n")
69
template = ("from bzrlib.tests.test_plugins import TestLoadingPlugins\n"
70
"TestLoadingPlugins.activeattributes[%r].append('%s')\n")
111
71
print >> file(os.path.join('first', 'plugin.py'), 'w'), template % (tempattribute, 'first')
112
72
print >> file(os.path.join('second', 'plugin.py'), 'w'), template % (tempattribute, 'second')
114
bzrlib.plugin.load_from_dirs(['first', 'second'])
115
self.assertEqual(['first'], self.activeattributes[tempattribute])
74
bzrlib.plugin.load_from_path(['first', 'second'])
75
self.assertEqual(['first'], self.activeattributes[tempattribute])
77
# remove the plugin 'plugin'
78
del self.activeattributes[tempattribute]
79
if getattr(bzrlib.plugins, 'plugin', None):
80
del bzrlib.plugins.plugin
81
self.failIf(getattr(bzrlib.plugins, 'plugin', None))
83
def test_plugins_from_different_dirs_can_demand_load(self):
84
# This test tests that having two plugins in different
85
# directories with different names allows them both to be loaded, when
86
# we do a direct import statement.
87
# Determine a file name we can use which is also a valid attribute
88
# for accessing in activeattributes. - we cannot give import parameters.
89
tempattribute = "different-dirs"
90
self.failIf(tempattribute in self.activeattributes)
91
# set a place for the plugins to record their loading, and at the same
92
# time validate that the location the plugins should record to is
94
bzrlib.tests.test_plugins.TestLoadingPlugins.activeattributes \
96
self.failUnless(tempattribute in self.activeattributes)
97
# create two plugin directories
100
# write plugins that will record when they are loaded in the
101
# tempattribute list.
102
template = ("from bzrlib.tests.test_plugins import TestLoadingPlugins\n"
103
"TestLoadingPlugins.activeattributes[%r].append('%s')\n")
104
print >> file(os.path.join('first', 'pluginone.py'), 'w'), template % (tempattribute, 'first')
105
print >> file(os.path.join('second', 'plugintwo.py'), 'w'), template % (tempattribute, 'second')
106
oldpath = bzrlib.plugins.__path__
108
bzrlib.plugins.__path__ = ['first', 'second']
109
exec "import bzrlib.plugins.pluginone"
110
self.assertEqual(['first'], self.activeattributes[tempattribute])
111
exec "import bzrlib.plugins.plugintwo"
112
self.assertEqual(['first', 'second'],
113
self.activeattributes[tempattribute])
117
115
# remove the plugin 'plugin'
118
116
del self.activeattributes[tempattribute]
130
128
# write a plugin that _cannot_ fail to load.
131
129
print >> file('plugin.py', 'w'), ""
133
bzrlib.plugin.load_from_dirs(['.'])
131
bzrlib.plugin.load_from_path(['.'])
134
132
self.failUnless('plugin' in bzrlib.plugin.all_plugins())
135
133
self.failUnless(getattr(bzrlib.plugins, 'plugin', None))
136
134
self.assertEqual(bzrlib.plugin.all_plugins()['plugin'],
137
135
bzrlib.plugins.plugin)
139
137
# remove the plugin 'plugin'
138
if 'bzrlib.plugins.plugin' in sys.modules:
139
del sys.modules['bzrlib.plugins.plugin']
140
140
if getattr(bzrlib.plugins, 'plugin', None):
141
141
del bzrlib.plugins.plugin
142
142
self.failIf(getattr(bzrlib.plugins, 'plugin', None))
225
225
def test_load_package(self):
226
226
self.make_zipped_plugin('./test.zip', 'ziplug/__init__.py')
227
227
self.check_plugin_load('./test.zip', 'ziplug')
230
class TestSetPluginsPath(TestCase):
232
def test_set_plugins_path(self):
233
"""set_plugins_path should set the module __path__ correctly."""
234
old_path = bzrlib.plugins.__path__
236
bzrlib.plugins.__path__ = []
237
expected_path = bzrlib.plugin.set_plugins_path()
238
self.assertEqual(expected_path, bzrlib.plugins.__path__)
240
bzrlib.plugins.__path__ = old_path