9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
"""Tests for plugins"""
19
20
# XXX: There are no plugin tests at the moment because the plugin module
24
25
from StringIO import StringIO
28
27
import bzrlib.plugin
29
28
import bzrlib.plugins
30
29
import bzrlib.commands
32
from bzrlib.tests import TestCase, TestCaseInTempDir
31
from bzrlib.tests import TestCaseInTempDir
33
32
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)
37
77
import bzrlib.commands
45
85
# TODO: Write a test for plugin decoration of commands.
47
class TestLoadingPlugins(TestCaseInTempDir):
87
class TestOneNamedPluginOnly(TestCaseInTempDir):
49
89
activeattributes = {}
51
91
def test_plugins_with_the_same_name_are_not_loaded(self):
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.
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.
56
96
tempattribute = "0"
57
97
self.failIf(tempattribute in self.activeattributes)
58
98
# set a place for the plugins to record their loading, and at the same
59
99
# time validate that the location the plugins should record to is
60
100
# valid and correct.
61
bzrlib.tests.test_plugins.TestLoadingPlugins.activeattributes \
101
bzrlib.tests.test_plugins.TestOneNamedPluginOnly.activeattributes \
62
102
[tempattribute] = []
63
103
self.failUnless(tempattribute in self.activeattributes)
64
104
# create two plugin directories
66
106
os.mkdir('second')
67
107
# write a plugin that will record when its loaded in the
68
108
# tempattribute list.
69
template = ("from bzrlib.tests.test_plugins import TestLoadingPlugins\n"
70
"TestLoadingPlugins.activeattributes[%r].append('%s')\n")
109
template = ("from bzrlib.tests.test_plugins import TestOneNamedPluginOnly\n"
110
"TestOneNamedPluginOnly.activeattributes[%r].append('%s')\n")
71
111
print >> file(os.path.join('first', 'plugin.py'), 'w'), template % (tempattribute, 'first')
72
112
print >> file(os.path.join('second', 'plugin.py'), 'w'), template % (tempattribute, 'second')
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])
114
bzrlib.plugin.load_from_dirs(['first', 'second'])
115
self.assertEqual(['first'], self.activeattributes[tempattribute])
115
117
# remove the plugin 'plugin'
116
118
del self.activeattributes[tempattribute]
128
130
# write a plugin that _cannot_ fail to load.
129
131
print >> file('plugin.py', 'w'), ""
131
bzrlib.plugin.load_from_path(['.'])
133
bzrlib.plugin.load_from_dirs(['.'])
132
134
self.failUnless('plugin' in bzrlib.plugin.all_plugins())
133
135
self.failUnless(getattr(bzrlib.plugins, 'plugin', None))
134
136
self.assertEqual(bzrlib.plugin.all_plugins()['plugin'],
135
137
bzrlib.plugins.plugin)
137
139
# 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))
187
bzrlib.plugin.load_from_path(['plugin_test'])
187
bzrlib.plugin.load_from_dirs(['plugin_test'])
188
188
bzrlib.commands.register_command( bzrlib.plugins.myplug.cmd_myplug)
189
189
help = self.capture('help myplug')
190
190
self.assertContainsRe(help, 'From plugin "myplug"')
191
191
help = self.split_help_commands()['myplug']
192
192
self.assertContainsRe(help, '\[myplug\]')
195
if bzrlib.commands.plugin_cmds.get('myplug', None):
196
del bzrlib.commands.plugin_cmds['myplug']
197
# remove the plugin 'myplug'
198
if getattr(bzrlib.plugins, 'myplug', None):
199
delattr(bzrlib.plugins, 'myplug')
202
class TestPluginFromZip(TestCaseInTempDir):
204
def make_zipped_plugin(self, zip_name, filename):
205
z = zipfile.ZipFile(zip_name, 'w')
206
z.writestr(filename, PLUGIN_TEXT)
209
def check_plugin_load(self, zip_name, plugin_name):
210
self.assertFalse(plugin_name in dir(bzrlib.plugins),
211
'Plugin already loaded')
213
bzrlib.plugin.load_from_zip(zip_name)
214
self.assertTrue(plugin_name in dir(bzrlib.plugins),
215
'Plugin is not loaded')
218
if getattr(bzrlib.plugins, plugin_name, None):
219
delattr(bzrlib.plugins, plugin_name)
221
def test_load_module(self):
222
self.make_zipped_plugin('./test.zip', 'ziplug.py')
223
self.check_plugin_load('./test.zip', 'ziplug')
225
def test_load_package(self):
226
self.make_zipped_plugin('./test.zip', 'ziplug/__init__.py')
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
194
# remove the plugin 'plugin'
195
if getattr(bzrlib.plugins, 'plugin', None):
196
del bzrlib.plugins.plugin