~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_plugins.py

  • Committer: John Arbash Meinel
  • Date: 2007-02-13 20:33:57 UTC
  • mfrom: (2283 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2294.
  • Revision ID: john@arbash-meinel.com-20070213203357-b7yg41mi9sk6cqd0
[merge] bzr.dev 2283
resolve conflicts in moved repository formats
small issue with osutils.contains_whitespace()

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
import os
24
24
from StringIO import StringIO
 
25
import sys
25
26
import zipfile
26
27
 
27
28
import bzrlib.plugin
28
29
import bzrlib.plugins
29
30
import bzrlib.commands
30
31
import bzrlib.help
31
 
from bzrlib.tests import TestCaseInTempDir
 
32
from bzrlib.tests import TestCase, TestCaseInTempDir
32
33
from bzrlib.osutils import pathjoin, abspath
33
34
 
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)
41
 
#        f.close()
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
46
 
#
47
 
#        assert backtick('bzr commit -m test') == "I'm sorry dave, you can't do that\n"
48
 
#
49
 
#        shutil.rmtree('plugin_test')
50
 
#
51
 
 
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
56
 
 
57
 
 
58
 
#         assert backtick('bzr myplug') == 'Hello from my plugin\n'
59
 
#         assert backtick('bzr mplg') == 'Hello from my plugin\n'
60
 
 
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"
67
 
 
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)
73
 
 
74
 
#         """
75
35
 
76
36
PLUGIN_TEXT = """\
77
37
import bzrlib.commands
84
44
 
85
45
# TODO: Write a test for plugin decoration of commands.
86
46
 
87
 
class TestOneNamedPluginOnly(TestCaseInTempDir):
 
47
class TestLoadingPlugins(TestCaseInTempDir):
88
48
 
89
49
    activeattributes = {}
90
50
 
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')
113
73
        try:
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])
 
76
        finally:
 
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))
 
82
 
 
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
 
93
        # valid and correct.
 
94
        bzrlib.tests.test_plugins.TestLoadingPlugins.activeattributes \
 
95
            [tempattribute] = []
 
96
        self.failUnless(tempattribute in self.activeattributes)
 
97
        # create two plugin directories
 
98
        os.mkdir('first')
 
99
        os.mkdir('second')
 
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__
 
107
        try:
 
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])
116
114
        finally:
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'), ""
132
130
        try:
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)
138
136
        finally:
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))
184
184
 
185
185
        try:
186
186
            # Check its help
187
 
            bzrlib.plugin.load_from_dirs(['plugin_test'])
 
187
            bzrlib.plugin.load_from_path(['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"')
210
210
        self.assertFalse(plugin_name in dir(bzrlib.plugins),
211
211
                         'Plugin already loaded')
212
212
        try:
213
 
            bzrlib.plugin.load_from_zips([zip_name])
 
213
            bzrlib.plugin.load_from_zip(zip_name)
214
214
            self.assertTrue(plugin_name in dir(bzrlib.plugins),
215
215
                            'Plugin is not loaded')
216
216
        finally:
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')
 
228
 
 
229
 
 
230
class TestSetPluginsPath(TestCase):
 
231
    
 
232
    def test_set_plugins_path(self):
 
233
        """set_plugins_path should set the module __path__ correctly."""
 
234
        old_path = bzrlib.plugins.__path__
 
235
        try:
 
236
            bzrlib.plugins.__path__ = []
 
237
            expected_path = bzrlib.plugin.set_plugins_path()
 
238
            self.assertEqual(expected_path, bzrlib.plugins.__path__)
 
239
        finally:
 
240
            bzrlib.plugins.__path__ = old_path