~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_import_tariff.py

  • Committer: Jelmer Vernooij
  • Date: 2011-05-03 22:58:22 UTC
  • mfrom: (5816.1.4 serve-tariff)
  • mto: This revision was merged to the branch mainline in revision 5819.
  • Revision ID: jelmer@samba.org-20110503225822-frqt3nj3g1ptgjrw
Merge serve-tariff.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
import os
21
21
from testtools import content
22
22
 
 
23
from bzrlib.bzrdir import BzrDir
 
24
from bzrlib.smart import medium
 
25
from bzrlib.transport import remote
 
26
 
23
27
from bzrlib.plugin import (
24
28
    are_plugins_disabled,
25
29
    )
28
32
    TestCaseWithTransport,
29
33
    )
30
34
 
 
35
old_format_modules = [
 
36
    'bzrlib.repofmt.knitrepo',
 
37
    'bzrlib.repofmt.knitpack_repo',
 
38
    'bzrlib.plugins.weave_fmt.branch',
 
39
    'bzrlib.plugins.weave_fmt.bzrdir',
 
40
    'bzrlib.plugins.weave_fmt.repository',
 
41
    'bzrlib.plugins.weave_fmt.workingtree',
 
42
    'bzrlib.weave',
 
43
    'bzrlib.weavefile',
 
44
    'bzrlib.xml4',
 
45
    'bzrlib.xml5',
 
46
    'bzrlib.xml6',
 
47
    'bzrlib.xml7',
 
48
    ]
 
49
 
31
50
 
32
51
class TestImportTariffs(TestCaseWithTransport):
33
52
    """Check how many modules are loaded for some representative scenarios.
43
62
            self.preserved_env_vars[name] = os.environ.get(name)
44
63
        super(TestImportTariffs, self).setUp()
45
64
 
46
 
    def run_command_check_imports(self, args, forbidden_imports):
47
 
        """Run bzr ARGS in a subprocess and check its imports.
 
65
    def start_bzr_subprocess_with_import_check(self, args):
 
66
        """Run a bzr process and capture the imports.
48
67
 
49
68
        This is fairly expensive because we start a subprocess, so we aim to
50
69
        cover representative rather than exhaustive cases.
51
 
 
52
 
        :param forbidden_imports: List of fully-qualified Python module names
53
 
            that should not be loaded while running this command.
54
70
        """
55
71
        # We use PYTHON_VERBOSE rather than --profile-importts because in
56
72
        # experimentation the profile-imports output seems to not always show
63
79
        # explicitly do want to test against things installed there, therefore
64
80
        # we pass it through.
65
81
        env_changes = dict(PYTHONVERBOSE='1', **self.preserved_env_vars)
66
 
        out, err = self.run_bzr_subprocess(args,
67
 
            allow_plugins=(not are_plugins_disabled()),
68
 
            env_changes=env_changes)
69
 
 
 
82
        return self.start_bzr_subprocess(args, env_changes=env_changes,
 
83
            allow_plugins=(not are_plugins_disabled()))
 
84
 
 
85
    def check_forbidden_modules(self, err, forbidden_imports):
 
86
        """Check for forbidden modules in stderr.
 
87
 
 
88
        :param err: Standard error
 
89
        :param forbidden_imports: List of forbidden modules
 
90
        """
70
91
        self.addDetail('subprocess_stderr',
71
92
            content.Content(content.ContentType("text", "plain"),
72
93
                lambda:[err]))
77
98
                bad_modules.append(module_name)
78
99
 
79
100
        if bad_modules:
80
 
            self.fail("command %r loaded forbidden modules %r"
81
 
                % (args, bad_modules))
 
101
            self.fail("command loaded forbidden modules %r"
 
102
                % (bad_modules,))
 
103
 
 
104
    def finish_bzr_subprocess_with_import_check(self, process,
 
105
            args, forbidden_imports):
 
106
        """Finish subprocess and check specific modules have not been
 
107
        imported.
 
108
 
 
109
        :param forbidden_imports: List of fully-qualified Python module names
 
110
            that should not be loaded while running this command.
 
111
        """
 
112
        (out, err) = self.finish_bzr_subprocess(process,
 
113
            universal_newlines=False, process_args=args)
 
114
        self.check_forbidden_modules(err, forbidden_imports)
82
115
        return out, err
83
116
 
 
117
    def run_command_check_imports(self, args, forbidden_imports):
 
118
        """Run bzr ARGS in a subprocess and check its imports.
 
119
 
 
120
        This is fairly expensive because we start a subprocess, so we aim to
 
121
        cover representative rather than exhaustive cases.
 
122
 
 
123
        :param forbidden_imports: List of fully-qualified Python module names
 
124
            that should not be loaded while running this command.
 
125
        """
 
126
        process = self.start_bzr_subprocess_with_import_check(args)
 
127
        self.finish_bzr_subprocess_with_import_check(process, args,
 
128
            forbidden_imports)
 
129
 
84
130
    def test_import_tariffs_working(self):
85
131
        # check some guaranteed-true and false imports to be sure we're
86
132
        # measuring correctly
113
159
            'bzrlib.msgeditor',
114
160
            'bzrlib.patiencediff',
115
161
            'bzrlib.remote',
116
 
            'bzrlib.repofmt.knitrepo',
117
 
            'bzrlib.repofmt.knitpack_repo',
118
162
            'bzrlib.rules',
119
163
            'bzrlib.sign_my_commits',
120
164
            'bzrlib.smart',
123
167
            'bzrlib.smart.server',
124
168
            'bzrlib.transform',
125
169
            'bzrlib.version_info_formats.format_rio',
126
 
            'bzrlib.plugins.weave_fmt.branch',
127
 
            'bzrlib.plugins.weave_fmt.bzrdir',
128
 
            'bzrlib.plugins.weave_fmt.repository',
129
 
            'bzrlib.plugins.weave_fmt.workingtree',
130
 
            'bzrlib.weave',
131
 
            'bzrlib.weavefile',
132
 
            'bzrlib.xml4',
133
 
            'bzrlib.xml5',
134
 
            'bzrlib.xml6',
135
 
            'bzrlib.xml7',
136
170
            'getpass',
137
171
            'kerberos',
138
172
            'smtplib',
139
173
            'tarfile',
140
174
            'tempfile',
141
 
            ])
 
175
            ] + old_format_modules)
142
176
        # TODO: similar test for repository-only operations, checking we avoid
143
177
        # loading wt-specific stuff
144
178
        #
149
183
        self.run_command_check_imports(['help', 'commands'], [
150
184
            'testtools',
151
185
            ])
 
186
 
 
187
    def test_simple_serve(self):
 
188
        # 'serve' in a default format working tree shouldn't need many modules
 
189
        tree = self.make_branch_and_tree('.')
 
190
        process = self.start_bzr_subprocess_with_import_check(['serve',
 
191
            '--inet', '-d', tree.basedir])
 
192
        url = 'bzr://localhost/'
 
193
        self.permit_url(url)
 
194
        client_medium = medium.SmartSimplePipesClientMedium(
 
195
            process.stdout, process.stdin, url)
 
196
        transport = remote.RemoteTransport(url, medium=client_medium)
 
197
        branch = BzrDir.open_from_transport(transport).open_branch()
 
198
        process.stdin.close()
 
199
        # Hide stdin from the subprocess module, so it won't fail to close it.
 
200
        process.stdin = None
 
201
        (out, err) = self.finish_bzr_subprocess(process,
 
202
            universal_newlines=False)
 
203
        self.check_forbidden_modules(err,
 
204
            ['bzrlib.annotate',
 
205
            'bzrlib.atomicfile',
 
206
            'bzrlib.bugtracker',
 
207
            'bzrlib.bundle.commands',
 
208
            'bzrlib.cmd_version_info',
 
209
            'bzrlib.externalcommand',
 
210
            'bzrlib.filters',
 
211
            # foreign branch plugins import the foreign_vcs_registry from 
 
212
            # bzrlib.foreign so it can't be blacklisted
 
213
            'bzrlib.gpg',
 
214
            'bzrlib.info',
 
215
            'bzrlib.knit',
 
216
            'bzrlib.merge3',
 
217
            'bzrlib.merge_directive',
 
218
            'bzrlib.msgeditor',
 
219
            'bzrlib.patiencediff',
 
220
            'bzrlib.remote',
 
221
            'bzrlib.rules',
 
222
            'bzrlib.sign_my_commits',
 
223
            'bzrlib.smart.client',
 
224
            'bzrlib.transform',
 
225
            'bzrlib.version_info_formats.format_rio',
 
226
            'getpass',
 
227
            'kerberos',
 
228
            'smtplib',
 
229
            'tarfile',
 
230
            'tempfile',
 
231
            ] + old_format_modules)