116
146
# remove the plugin 'plugin'
117
147
del self.activeattributes[tempattribute]
118
if getattr(bzrlib.plugins, 'plugin', None):
119
del bzrlib.plugins.plugin
120
self.failIf(getattr(bzrlib.plugins, 'plugin', None))
123
class TestAllPlugins(TestCaseInTempDir):
125
def test_plugin_appears_in_all_plugins(self):
126
# This test tests a new plugin appears in bzrlib.plugin.all_plugins().
148
if getattr(bzrlib.plugins, 'pluginone', None):
149
del bzrlib.plugins.pluginone
150
if getattr(bzrlib.plugins, 'plugintwo', None):
151
del bzrlib.plugins.plugintwo
152
self.failIf(getattr(bzrlib.plugins, 'pluginone', None))
153
self.failIf(getattr(bzrlib.plugins, 'plugintwo', None))
155
def test_plugins_can_load_from_directory_with_trailing_slash(self):
156
# This test tests that a plugin can load from a directory when the
157
# directory in the path has a trailing slash.
158
# check the plugin is not loaded already
159
self.failIf(getattr(bzrlib.plugins, 'ts_plugin', None))
160
tempattribute = "trailing-slash"
161
self.failIf(tempattribute in self.activeattributes)
162
# set a place for the plugin to record its loading, and at the same
163
# time validate that the location the plugin should record to is
165
bzrlib.tests.test_plugins.TestLoadingPlugins.activeattributes \
167
self.failUnless(tempattribute in self.activeattributes)
168
# create a directory for the plugin
169
os.mkdir('plugin_test')
170
# write a plugin that will record when its loaded in the
171
# tempattribute list.
172
template = ("from bzrlib.tests.test_plugins import TestLoadingPlugins\n"
173
"TestLoadingPlugins.activeattributes[%r].append('%s')\n")
175
outfile = open(os.path.join('plugin_test', 'ts_plugin.py'), 'w')
177
outfile.write(template % (tempattribute, 'plugin'))
183
bzrlib.plugin.load_from_path(['plugin_test'+os.sep])
184
self.assertEqual(['plugin'], self.activeattributes[tempattribute])
186
# remove the plugin 'plugin'
187
del self.activeattributes[tempattribute]
188
if getattr(bzrlib.plugins, 'ts_plugin', None):
189
del bzrlib.plugins.ts_plugin
190
self.failIf(getattr(bzrlib.plugins, 'ts_plugin', None))
192
def test_plugin_with_bad_name_does_not_load(self):
193
# Create badly-named plugin
194
file('bad plugin-name..py', 'w').close()
198
handler = logging.StreamHandler(stream)
199
log = logging.getLogger('bzr')
200
log.addHandler(handler)
202
bzrlib.plugin.load_from_dir('.')
204
# Stop capturing output
207
log.removeHandler(handler)
209
self.assertContainsRe(stream.getvalue(),
210
r"Unable to load 'bad plugin-name\.' in '\.' as a plugin because"
211
" file path isn't a valid module name; try renaming it to"
212
" 'bad_plugin_name_'\.")
217
class TestPlugins(TestCaseInTempDir):
219
def setup_plugin(self, source=""):
220
# This test tests a new plugin appears in bzrlib.plugin.plugins().
127
221
# check the plugin is not loaded already
128
222
self.failIf(getattr(bzrlib.plugins, 'plugin', None))
129
223
# write a plugin that _cannot_ fail to load.
130
print >> file('plugin.py', 'w'), ""
132
bzrlib.plugin.load_from_path(['.'])
133
self.failUnless('plugin' in bzrlib.plugin.all_plugins())
134
self.failUnless(getattr(bzrlib.plugins, 'plugin', None))
135
self.assertEqual(bzrlib.plugin.all_plugins()['plugin'],
136
bzrlib.plugins.plugin)
138
# remove the plugin 'plugin'
139
if 'bzrlib.plugins.plugin' in sys.modules:
140
del sys.modules['bzrlib.plugins.plugin']
141
if getattr(bzrlib.plugins, 'plugin', None):
142
del bzrlib.plugins.plugin
224
file('plugin.py', 'w').write(source + '\n')
225
self.addCleanup(self.teardown_plugin)
226
bzrlib.plugin.load_from_path(['.'])
228
def teardown_plugin(self):
229
# remove the plugin 'plugin'
230
if 'bzrlib.plugins.plugin' in sys.modules:
231
del sys.modules['bzrlib.plugins.plugin']
232
if getattr(bzrlib.plugins, 'plugin', None):
233
del bzrlib.plugins.plugin
143
234
self.failIf(getattr(bzrlib.plugins, 'plugin', None))
236
def test_plugin_appears_in_plugins(self):
238
self.failUnless('plugin' in bzrlib.plugin.plugins())
239
self.failUnless(getattr(bzrlib.plugins, 'plugin', None))
240
plugins = bzrlib.plugin.plugins()
241
plugin = plugins['plugin']
242
self.assertIsInstance(plugin, bzrlib.plugin.PlugIn)
243
self.assertEqual(bzrlib.plugins.plugin, plugin.module)
245
def test_trivial_plugin_get_path(self):
247
plugins = bzrlib.plugin.plugins()
248
plugin = plugins['plugin']
249
plugin_path = self.test_dir + '/plugin.py'
250
self.assertIsSameRealPath(plugin_path, normpath(plugin.path()))
252
def test_plugin_get_path_py_not_pyc(self):
253
self.setup_plugin() # after first import there will be plugin.pyc
254
self.teardown_plugin()
255
bzrlib.plugin.load_from_path(['.']) # import plugin.pyc
256
plugins = bzrlib.plugin.plugins()
257
plugin = plugins['plugin']
258
plugin_path = self.test_dir + '/plugin.py'
259
self.assertIsSameRealPath(plugin_path, normpath(plugin.path()))
261
def test_plugin_get_path_pyc_only(self):
262
self.setup_plugin() # after first import there will be plugin.pyc
263
self.teardown_plugin()
264
os.unlink(self.test_dir + '/plugin.py')
265
bzrlib.plugin.load_from_path(['.']) # import plugin.pyc
266
plugins = bzrlib.plugin.plugins()
267
plugin = plugins['plugin']
269
plugin_path = self.test_dir + '/plugin.pyc'
271
plugin_path = self.test_dir + '/plugin.pyo'
272
self.assertIsSameRealPath(plugin_path, normpath(plugin.path()))
274
def test_no_test_suite_gives_None_for_test_suite(self):
276
plugin = bzrlib.plugin.plugins()['plugin']
277
self.assertEqual(None, plugin.test_suite())
279
def test_test_suite_gives_test_suite_result(self):
280
source = """def test_suite(): return 'foo'"""
281
self.setup_plugin(source)
282
plugin = bzrlib.plugin.plugins()['plugin']
283
self.assertEqual('foo', plugin.test_suite())
285
def test_no_version_info(self):
287
plugin = bzrlib.plugin.plugins()['plugin']
288
self.assertEqual(None, plugin.version_info())
290
def test_with_version_info(self):
291
self.setup_plugin("version_info = (1, 2, 3, 'dev', 4)")
292
plugin = bzrlib.plugin.plugins()['plugin']
293
self.assertEqual((1, 2, 3, 'dev', 4), plugin.version_info())
295
def test_short_version_info_gets_padded(self):
296
# the gtk plugin has version_info = (1,2,3) rather than the 5-tuple.
298
self.setup_plugin("version_info = (1, 2, 3)")
299
plugin = bzrlib.plugin.plugins()['plugin']
300
self.assertEqual((1, 2, 3, 'final', 0), plugin.version_info())
302
def test_no_version_info___version__(self):
304
plugin = bzrlib.plugin.plugins()['plugin']
305
self.assertEqual("unknown", plugin.__version__)
307
def test___version__with_version_info(self):
308
self.setup_plugin("version_info = (1, 2, 3, 'dev', 4)")
309
plugin = bzrlib.plugin.plugins()['plugin']
310
self.assertEqual("1.2.3dev4", plugin.__version__)
312
def test_final__version__with_version_info(self):
313
self.setup_plugin("version_info = (1, 2, 3, 'final', 4)")
314
plugin = bzrlib.plugin.plugins()['plugin']
315
self.assertEqual("1.2.3", plugin.__version__)
146
318
class TestPluginHelp(TestCaseInTempDir):
148
320
def split_help_commands(self):
151
for line in self.capture('help commands').splitlines():
323
for line in self.run_bzr('help commands')[0].splitlines():
152
324
if not line.startswith(' '):
153
325
current = line.split()[0]
154
326
help[current] = help.get(current, '') + line