/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2005-2013, 2015, 2016 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
608 by Martin Pool
- Split selftests out into a new module and start changing them
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
608 by Martin Pool
- Split selftests out into a new module and start changing them
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
608 by Martin Pool
- Split selftests out into a new module and start changing them
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
608 by Martin Pool
- Split selftests out into a new module and start changing them
16
5131.2.5 by Martin
Add module docstring to bzrlib.tests
17
"""Testing framework extensions"""
609 by Martin Pool
- cleanup test code
18
6379.6.1 by Jelmer Vernooij
Import absolute_import in a few places.
19
from __future__ import absolute_import
20
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
21
# NOTE: Some classes in here use camelCaseNaming() rather than
22
# underscore_naming().  That's for consistency with unittest; it's not the
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
23
# general style of breezy.  Please continue that consistency when adding e.g.
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
24
# new assertFoo() methods.
25
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
26
import atexit
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
27
import codecs
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
28
import copy
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
29
import difflib
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
30
import doctest
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
31
import errno
6658.1.1 by Martin
Nibble away at getting test_selftest to pass on Python 3
32
import functools
6973.13.2 by Jelmer Vernooij
Fix some more tests.
33
from io import (
34
    BytesIO,
35
    StringIO,
7065.3.3 by Jelmer Vernooij
Add a run_bzr_raw function and use it.
36
    TextIOWrapper,
6973.13.2 by Jelmer Vernooij
Fix some more tests.
37
    )
5365.3.1 by Andrew Bennetts
Better (and simpler) algorithm for partition_tests.
38
import itertools
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
39
import logging
6606.1.1 by Jelmer Vernooij
Add local copy of _delta_to_float from testtools, rather than
40
import math
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
41
import os
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
42
import platform
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
43
import pprint
2394.2.2 by Ian Clatworthy
Add --randomize and update help
44
import random
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
45
import re
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
46
import shlex
6331.4.1 by Martin Packman
Set before starting a test subprocess to compute the same sys.path
47
import site
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
48
import stat
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
49
import subprocess
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
50
import sys
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
51
import tempfile
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
52
import threading
3084.1.1 by Andrew Bennetts
Add a --coverage option to selftest.
53
import time
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
54
import traceback
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
55
import unittest
2485.6.5 by Martin Pool
Remove keep_output option
56
import warnings
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
57
4794.1.1 by Robert Collins
Derive bzr's TestCase from testtools.testcase.TestCase.
58
import testtools
4922.1.2 by Martin Pool
Better guards on checks of testtools versions
59
# nb: check this before importing anything else from within it
60
_testtools_version = getattr(testtools, '__version__', ())
5418.5.1 by Martin
Change the minimum version of testtools required for selftest to 0.9.5
61
if _testtools_version < (0, 9, 5):
62
    raise ImportError("need at least testtools 0.9.5: %s is %r"
7143.15.2 by Jelmer Vernooij
Run autopep8.
63
                      % (testtools.__file__, _testtools_version))
4794.1.6 by Robert Collins
Add a details object to bzr tests containing the test log. May currently result in failures show the log twice (but will now show the log in --subunit mode [which includes --parallel]).
64
from testtools import content
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
65
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
66
import breezy
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
67
from .. import (
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
68
    branchbuilder,
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
69
    controldir,
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
70
    commands as _mod_commands,
4695.3.2 by Vincent Ladeuil
Simplified and claried as per Robert's review.
71
    config,
6131.1.1 by Jonathan Riddell
do not use i18n in tests
72
    i18n,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
73
    debug,
74
    errors,
4119.3.1 by Robert Collins
Create a single registry of all Hooks classes, removing the test suite knowledge of such hooks and allowing plugins to sensibly and safely define new hooks.
75
    hooks,
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
76
    lock as _mod_lock,
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
77
    lockdir,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
78
    osutils,
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
79
    plugin as _mod_plugin,
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
80
    pyutils,
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
81
    ui,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
82
    urlutils,
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
83
    registry,
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
84
    symbol_versioning,
85
    trace,
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
86
    transport as _mod_transport,
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
87
    workingtree,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
88
    )
6670.4.1 by Jelmer Vernooij
Update imports.
89
from breezy.bzr import (
90
    chk_map,
91
    )
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
92
try:
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
93
    import breezy.lsprof
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
94
except ImportError:
95
    # lsprof not available
96
    pass
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
97
from ..sixish import (
7045.4.8 by Jelmer Vernooij
Fix another 128 tests on python 3.
98
    int2byte,
6677.1.1 by Martin
Go back to native str for urls and many other py3 changes
99
    PY3,
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
100
    string_types,
101
    text_type,
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
102
    )
6670.4.16 by Jelmer Vernooij
Move smart to breezy.bzr.
103
from ..bzr.smart import client, request
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
104
from ..transport import (
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
105
    memory,
106
    pathfilter,
107
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
108
from ..tests import (
6319.1.1 by Martin Pool
Add selftest.timeout option, defaulting to 600
109
    fixtures,
5017.3.6 by Vincent Ladeuil
Fix some fallouts of moving test servers around.
110
    test_server,
111
    TestUtil,
5200.2.3 by Robert Collins
Make 'pydoc bzrlib.tests.build_tree_shape' useful.
112
    treeshape,
6621.22.1 by Martin
Refactor bzrlib.ui to be based on unicode streams
113
    ui_testing,
5017.3.6 by Vincent Ladeuil
Fix some fallouts of moving test servers around.
114
    )
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
115
2387.2.1 by Robert Collins
Mark bzrlib.tests as providing assertFOO helper functions by adding a __unittest global attribute. (Robert Collins, Andrew Bennetts, Martin Pool, Jonathan Lange)
116
# Mark this python module as being part of the implementation
117
# of unittest: this gives us better tracebacks where the last
118
# shown frame is the test code, not our assertXYZ.
6677.1.3 by Martin
Small corrections on top of the mass changes
119
__unittest = 1
2387.2.1 by Robert Collins
Mark bzrlib.tests as providing assertFOO helper functions by adding a __unittest global attribute. (Robert Collins, Andrew Bennetts, Martin Pool, Jonathan Lange)
120
5017.3.6 by Vincent Ladeuil
Fix some fallouts of moving test servers around.
121
default_transport = test_server.LocalURLServer
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
122
4985.1.3 by Vincent Ladeuil
Change it to a more usable form.
123
124
_unitialized_attr = object()
125
"""A sentinel needed to act as a default value in a method signature."""
126
127
4573.2.3 by Robert Collins
Support python 2.4.
128
# Subunit result codes, defined here to prevent a hard dependency on subunit.
129
SUBUNIT_SEEK_SET = 0
130
SUBUNIT_SEEK_CUR = 1
131
5404.2.1 by John Arbash Meinel
Fix bug #627438 by restoring TestSuite and TestLoader.
132
# These are intentionally brought into this namespace. That way plugins, etc
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
133
# can just "from breezy.tests import TestCase, TestLoader, etc"
5404.2.1 by John Arbash Meinel
Fix bug #627438 by restoring TestSuite and TestLoader.
134
TestSuite = TestUtil.TestSuite
135
TestLoader = TestUtil.TestLoader
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
136
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
137
# Tests should run in a clean and clearly defined environment. The goal is to
138
# keep them isolated from the running environment as mush as possible. The test
139
# framework ensures the variables defined below are set (or deleted if the
140
# value is None) before a test is run and reset to their original value after
141
# the test is run. Generally if some code depends on an environment variable,
142
# the tests should start without this variable in the environment. There are a
143
# few exceptions but you shouldn't violate this rule lightly.
144
isolated_environ = {
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
145
    'BRZ_HOME': None,
5574.6.7 by Vincent Ladeuil
Set HOME to None in isolated_environ and rename DocTestSuite to BzrDocTestSuite to reduce confusion (I still think it's a bad name space usage :)
146
    'HOME': None,
6770.2.5 by Jelmer Vernooij
Set GNUPGHOME in tests.
147
    'GNUPGHOME': None,
6437.58.1 by Wouter van Heyst
Properly isolate all tests from XDG_CONFIG_HOME.
148
    'XDG_CONFIG_HOME': None,
6622.1.30 by Jelmer Vernooij
Some more test fixes.
149
    # brz now uses the Win32 API and doesn't rely on APPDATA, but the
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
150
    # tests do check our impls match APPDATA
7143.15.2 by Jelmer Vernooij
Run autopep8.
151
    'BRZ_EDITOR': None,  # test_msgeditor manipulates this variable
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
152
    'VISUAL': None,
153
    'EDITOR': None,
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
154
    'BRZ_EMAIL': None,
7143.15.2 by Jelmer Vernooij
Run autopep8.
155
    'BZREMAIL': None,  # may still be present in the environment
156
    'EMAIL': 'jrandom@example.com',  # set EMAIL as brz does not guess
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
157
    'BRZ_PROGRESS_BAR': None,
7344.2.1 by Martin
Relocate the bzr log file out of $HOME
158
    # Trap leaks to $XDG_CACHE_HOME/breezy/brz.log. This occurs when tests use
159
    # TestCase as a base class instead of TestCaseInTempDir. Tests inheriting
160
    # from TestCase should not use disk resources, BRZ_LOG is one.
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
161
    'BRZ_LOG': '/you-should-use-TestCaseInTempDir-if-you-need-a-log-file',
6651.4.1 by Martin
Rewrite of the plugin module for Python 3 compat and general sanity
162
    'BRZ_PLUGIN_PATH': '-site',
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
163
    'BRZ_DISABLE_PLUGINS': None,
164
    'BRZ_PLUGINS_AT': None,
165
    'BRZ_CONCURRENCY': None,
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
166
    # Make sure that any text ui tests are consistent regardless of
167
    # the environment the test case is run in; you may want tests that
168
    # test other combinations.  'dumb' is a reasonable guess for tests
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
169
    # going to a pipe or a BytesIO.
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
170
    'TERM': 'dumb',
171
    'LINES': '25',
172
    'COLUMNS': '80',
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
173
    'BRZ_COLUMNS': '80',
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
174
    # Disable SSH Agent
175
    'SSH_AUTH_SOCK': None,
176
    # Proxies
177
    'http_proxy': None,
178
    'HTTP_PROXY': None,
179
    'https_proxy': None,
180
    'HTTPS_PROXY': None,
181
    'no_proxy': None,
182
    'NO_PROXY': None,
183
    'all_proxy': None,
184
    'ALL_PROXY': None,
6622.1.33 by Jelmer Vernooij
Fix more tests (all?)
185
    'BZR_REMOTE_PATH': None,
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
186
    # Generally speaking, we don't want apport reporting on crashes in
187
    # the test envirnoment unless we're specifically testing apport,
188
    # so that it doesn't leak into the real system environment.  We
189
    # use an env var so it propagates to subprocesses.
190
    'APPORT_DISABLE': '1',
191
    }
192
193
194
def override_os_environ(test, env=None):
195
    """Modify os.environ keeping a copy.
6793.3.1 by Jelmer Vernooij
Prevent leaking of BRZ_HOME into doctests.
196
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
197
    :param test: A test instance
198
199
    :param env: A dict containing variable definitions to be installed
200
    """
201
    if env is None:
202
        env = isolated_environ
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
203
    test._original_os_environ = dict(**os.environ)
204
    for var in env:
205
        osutils.set_or_unset_env(var, env[var])
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
206
        if var not in test._original_os_environ:
207
            # The var is new, add it with a value of None, so
208
            # restore_os_environ will delete it
209
            test._original_os_environ[var] = None
210
211
212
def restore_os_environ(test):
213
    """Restore os.environ to its original state.
214
215
    :param test: A test instance previously passed to override_os_environ.
216
    """
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
217
    for var, value in test._original_os_environ.items():
5574.7.1 by Vincent Ladeuil
Implement a fixture for isolating tests from ``os.environ``.
218
        # Restore the original value (or delete it if the value has been set to
219
        # None in override_os_environ).
220
        osutils.set_or_unset_env(var, value)
221
222
5340.16.14 by Martin
Factor out _type_equality_funcs to a new function
223
def _clear__type_equality_funcs(test):
224
    """Cleanup bound methods stored on TestCase instances
225
226
    Clear the dict breaking a few (mostly) harmless cycles in the affected
227
    unittests released with Python 2.6 and initial Python 2.7 versions.
228
229
    For a few revisions between Python 2.7.1 and Python 2.7.2 that annoyingly
230
    shipped in Oneiric, an object with no clear method was used, hence the
231
    extra complications, see bug 809048 for details.
232
    """
233
    type_equality_funcs = getattr(test, "_type_equality_funcs", None)
234
    if type_equality_funcs is not None:
235
        tef_clear = getattr(type_equality_funcs, "clear", None)
236
        if tef_clear is None:
237
            tef_instance_dict = getattr(type_equality_funcs, "__dict__", None)
238
            if tef_instance_dict is not None:
239
                tef_clear = tef_instance_dict.clear
240
        if tef_clear is not None:
241
            tef_clear()
242
243
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
244
class ExtendedTestResult(testtools.TextTestResult):
2095.4.1 by Martin Pool
Better progress bars during tests
245
    """Accepts, reports and accumulates the results of running tests.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
246
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
247
    Compared to the unittest version this class adds support for
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
248
    profiling, benchmarking, stopping as soon as a test fails,  and
249
    skipping tests.  There are further-specialized subclasses for
250
    different types of display.
251
252
    When a test finishes, in whatever way, it calls one of the addSuccess,
5690.1.1 by Samuel Bronson
Fix an obvious typo in ExtendedTestResult's docstring.
253
    addFailure or addError methods.  These in turn may redirect to a more
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
254
    specific case for the special test results supported by our extended
255
    tests.
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
256
257
    Note that just one of these objects is fed the results from many tests.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
258
    """
2095.4.1 by Martin Pool
Better progress bars during tests
259
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
260
    stop_early = False
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
261
2095.4.1 by Martin Pool
Better progress bars during tests
262
    def __init__(self, stream, descriptions, verbosity,
263
                 bench_history=None,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
264
                 strict=False,
2095.4.1 by Martin Pool
Better progress bars during tests
265
                 ):
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
266
        """Construct new TestResult.
267
268
        :param bench_history: Optionally, a writable file object to accumulate
269
            benchmark results.
270
        """
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
271
        testtools.TextTestResult.__init__(self, stream)
1819.1.1 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Give the test result object an optional benchmark
272
        if bench_history is not None:
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
273
            from breezy.version import _get_bzr_source_tree
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
274
            src_tree = _get_bzr_source_tree()
275
            if src_tree:
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
276
                try:
277
                    revision_id = src_tree.get_parent_ids()[0]
278
                except IndexError:
279
                    # XXX: if this is a brand new tree, do the same as if there
280
                    # is no branch.
6973.13.2 by Jelmer Vernooij
Fix some more tests.
281
                    revision_id = b''
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
282
            else:
283
                # XXX: If there's no branch, what should we do?
6973.13.2 by Jelmer Vernooij
Fix some more tests.
284
                revision_id = b''
1819.1.4 by Jan Balster
save the revison id for every benchmark run in .perf-history
285
            bench_history.write("--date %s %s\n" % (time.time(), revision_id))
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
286
        self._bench_history = bench_history
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
287
        self.ui = ui.ui_factory
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
288
        self.num_tests = 0
2095.4.1 by Martin Pool
Better progress bars during tests
289
        self.error_count = 0
290
        self.failure_count = 0
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
291
        self.known_failure_count = 0
2095.4.1 by Martin Pool
Better progress bars during tests
292
        self.skip_count = 0
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
293
        self.not_applicable_count = 0
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
294
        self.unsupported = {}
2095.4.1 by Martin Pool
Better progress bars during tests
295
        self.count = 0
296
        self._overall_start_time = time.time()
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
297
        self._strict = strict
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
298
        self._first_thread_leaker_id = None
299
        self._tests_leaking_threads_count = 0
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
300
        self._traceback_from_test = None
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
301
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
302
    def stopTestRun(self):
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
303
        run = self.testsRun
304
        actionTaken = "Ran"
305
        stopTime = time.time()
306
        timeTaken = stopTime - self.startTime
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
307
        # GZ 2010-07-19: Seems testtools has no printErrors method, and though
308
        #                the parent class method is similar have to duplicate
309
        self._show_list('ERROR', self.errors)
310
        self._show_list('FAIL', self.failures)
311
        self.stream.write(self.sep2)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
312
        self.stream.write("%s %d test%s in %.3fs\n\n" % (
313
            actionTaken, run, run != 1 and "s" or "", timeTaken))
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
314
        if not self.wasSuccessful():
315
            self.stream.write("FAILED (")
316
            failed, errored = map(len, (self.failures, self.errors))
317
            if failed:
318
                self.stream.write("failures=%d" % failed)
319
            if errored:
7143.15.2 by Jelmer Vernooij
Run autopep8.
320
                if failed:
321
                    self.stream.write(", ")
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
322
                self.stream.write("errors=%d" % errored)
323
            if self.known_failure_count:
7143.15.2 by Jelmer Vernooij
Run autopep8.
324
                if failed or errored:
325
                    self.stream.write(", ")
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
326
                self.stream.write("known_failure_count=%d" %
7143.15.2 by Jelmer Vernooij
Run autopep8.
327
                                  self.known_failure_count)
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
328
            self.stream.write(")\n")
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
329
        else:
330
            if self.known_failure_count:
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
331
                self.stream.write("OK (known_failures=%d)\n" %
7143.15.2 by Jelmer Vernooij
Run autopep8.
332
                                  self.known_failure_count)
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
333
            else:
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
334
                self.stream.write("OK\n")
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
335
        if self.skip_count > 0:
336
            skipped = self.skip_count
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
337
            self.stream.write('%d test%s skipped\n' %
7143.15.2 by Jelmer Vernooij
Run autopep8.
338
                              (skipped, skipped != 1 and "s" or ""))
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
339
        if self.unsupported:
340
            for feature, count in sorted(self.unsupported.items()):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
341
                self.stream.write("Missing feature '%s' skipped %d tests.\n" %
7143.15.2 by Jelmer Vernooij
Run autopep8.
342
                                  (feature, count))
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
343
        if self._strict:
344
            ok = self.wasStrictlySuccessful()
345
        else:
346
            ok = self.wasSuccessful()
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
347
        if self._first_thread_leaker_id:
4271.2.2 by Robert Collins
Move thread leak reporting to ExtendedTestResult.
348
            self.stream.write(
349
                '%s is leaking threads among %d leaking tests.\n' % (
7143.15.2 by Jelmer Vernooij
Run autopep8.
350
                    self._first_thread_leaker_id,
351
                    self._tests_leaking_threads_count))
4731.2.8 by Vincent Ladeuil
Collect and shutdown clients for SmartTCPServer_for_testing.
352
            # We don't report the main thread as an active one.
4732.2.1 by Vincent Ladeuil
Clearer thread leaks reports.
353
            self.stream.write(
354
                '%d non-main threads were left active in the end.\n'
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
355
                % (len(self._active_threads) - 1))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
356
4789.29.1 by Robert Collins
Show test ids not descriptions when reporting error/failures in tests.
357
    def getDescription(self, test):
358
        return test.id()
359
4794.1.10 by Robert Collins
Add benchmark time details object.
360
    def _extractBenchmarkTime(self, testCase, details=None):
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
361
        """Add a benchmark time for the current test case."""
4794.1.10 by Robert Collins
Add benchmark time details object.
362
        if details and 'benchtime' in details:
363
            return float(''.join(details['benchtime'].iter_bytes()))
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
364
        return getattr(testCase, "_benchtime", None)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
365
6606.1.1 by Jelmer Vernooij
Add local copy of _delta_to_float from testtools, rather than
366
    def _delta_to_float(self, a_timedelta, precision):
367
        # This calls ceiling to ensure that the most pessimistic view of time
368
        # taken is shown (rather than leaving it to the Python %f operator
369
        # to decide whether to round/floor/ceiling. This was added when we
370
        # had pyp3 test failures that suggest a floor was happening.
371
        shift = 10 ** precision
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
372
        return math.ceil(
373
            (a_timedelta.days * 86400.0 + a_timedelta.seconds +
374
             a_timedelta.microseconds / 1000000.0) * shift) / shift
6606.1.1 by Jelmer Vernooij
Add local copy of _delta_to_float from testtools, rather than
375
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
376
    def _elapsedTestTimeString(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
377
        """Return time string for overall time the current test has taken."""
5445.1.1 by Martin
Use times from testtools for individual test case timings
378
        return self._formatTime(self._delta_to_float(
6606.1.2 by Jelmer Vernooij
Fix arguments.
379
            self._now() - self._start_datetime, 3))
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
380
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
381
    def _testTimeString(self, testCase):
382
        benchmark_time = self._extractBenchmarkTime(testCase)
383
        if benchmark_time is not None:
4536.5.2 by Martin Pool
Reserve less space for test elapsed time; more space for test name
384
            return self._formatTime(benchmark_time) + "*"
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
385
        else:
4536.5.5 by Martin Pool
More selftest display test tweaks
386
            return self._elapsedTestTimeString()
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
387
388
    def _formatTime(self, seconds):
389
        """Format seconds as milliseconds with leading spaces."""
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
390
        # some benchmarks can take thousands of seconds to run, so we need 8
391
        # places
392
        return "%8dms" % (1000 * seconds)
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
393
2095.4.1 by Martin Pool
Better progress bars during tests
394
    def _shortened_test_description(self, test):
395
        what = test.id()
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
396
        what = re.sub(r'^breezy\.tests\.', '', what)
2095.4.1 by Martin Pool
Better progress bars during tests
397
        return what
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
398
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
399
    # GZ 2010-10-04: Cloned tests may end up harmlessly calling this method
400
    #                multiple times in a row, because the handler is added for
401
    #                each test but the container list is shared between cases.
402
    #                See lp:498869 lp:625574 and lp:637725 for background.
403
    def _record_traceback_from_test(self, exc_info):
404
        """Store the traceback from passed exc_info tuple till"""
405
        self._traceback_from_test = exc_info[2]
406
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
407
    def startTest(self, test):
5340.6.2 by Martin
Replace remaining to unittest.TestResult methods with super
408
        super(ExtendedTestResult, self).startTest(test)
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
409
        if self.count == 0:
410
            self.startTests()
5412.1.5 by Martin
Move test count addition into startTest from report methods in subclasses
411
        self.count += 1
2095.4.1 by Martin Pool
Better progress bars during tests
412
        self.report_test_start(test)
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
413
        test.number = self.count
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
414
        self._recordTestStartTime()
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
415
        # Make testtools cases give us the real traceback on failure
416
        addOnException = getattr(test, "addOnException", None)
417
        if addOnException is not None:
418
            addOnException(self._record_traceback_from_test)
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
419
        # Only check for thread leaks on breezy derived test cases
5580.2.1 by Martin
Do thread leak detection on bzrlib TestCase instances only rather than anything with addCleanup
420
        if isinstance(test, TestCase):
421
            test.addCleanup(self._check_leaked_threads, test)
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
422
5340.15.1 by John Arbash Meinel
supersede exc-info branch
423
    def stopTest(self, test):
424
        super(ExtendedTestResult, self).stopTest(test)
425
        # Manually break cycles, means touching various private things but hey
426
        getDetails = getattr(test, "getDetails", None)
427
        if getDetails is not None:
428
            getDetails().clear()
5340.16.14 by Martin
Factor out _type_equality_funcs to a new function
429
        _clear__type_equality_funcs(test)
5340.15.1 by John Arbash Meinel
supersede exc-info branch
430
        self._traceback_from_test = None
431
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
432
    def startTests(self):
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
433
        self.report_tests_starting()
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
434
        self._active_threads = threading.enumerate()
435
436
    def _check_leaked_threads(self, test):
5412.1.6 by Martin
Document the less obvious code and note future reporting plans, as requested in review by vila
437
        """See if any threads have leaked since last call
438
439
        A sample of live threads is stored in the _active_threads attribute,
440
        when this method runs it compares the current live threads and any not
441
        in the previous sample are treated as having leaked.
442
        """
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
443
        now_active_threads = set(threading.enumerate())
444
        threads_leaked = now_active_threads.difference(self._active_threads)
445
        if threads_leaked:
446
            self._report_thread_leak(test, threads_leaked, now_active_threads)
447
            self._tests_leaking_threads_count += 1
448
            if self._first_thread_leaker_id is None:
449
                self._first_thread_leaker_id = test.id()
450
            self._active_threads = now_active_threads
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
451
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
452
    def _recordTestStartTime(self):
453
        """Record that a test has started."""
5445.1.1 by Martin
Use times from testtools for individual test case timings
454
        self._start_datetime = self._now()
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
455
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
456
    def addError(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
457
        """Tell result that test finished with an error.
458
459
        Called from the TestCase run() method when the test
460
        fails with an unexpected error.
461
        """
7078.14.1 by Jelmer Vernooij
Don't rely on self._traceback_from_test as it gets set too late on Python 3 unittest.TestCase.
462
        self._post_mortem(self._traceback_from_test or err[2])
5340.6.2 by Martin
Replace remaining to unittest.TestResult methods with super
463
        super(ExtendedTestResult, self).addError(test, err)
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
464
        self.error_count += 1
465
        self.report_error(test, err)
466
        if self.stop_early:
467
            self.stop()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
468
469
    def addFailure(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
470
        """Tell result that test failed.
471
472
        Called from the TestCase run() method when the test
473
        fails because e.g. an assert() method failed.
474
        """
7078.14.1 by Jelmer Vernooij
Don't rely on self._traceback_from_test as it gets set too late on Python 3 unittest.TestCase.
475
        self._post_mortem(self._traceback_from_test or err[2])
5340.6.2 by Martin
Replace remaining to unittest.TestResult methods with super
476
        super(ExtendedTestResult, self).addFailure(test, err)
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
477
        self.failure_count += 1
478
        self.report_failure(test, err)
479
        if self.stop_early:
480
            self.stop()
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
481
4794.1.10 by Robert Collins
Add benchmark time details object.
482
    def addSuccess(self, test, details=None):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
483
        """Tell result that test completed successfully.
484
485
        Called from the TestCase run()
486
        """
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
487
        if self._bench_history is not None:
4794.1.10 by Robert Collins
Add benchmark time details object.
488
            benchmark_time = self._extractBenchmarkTime(test, details)
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
489
            if benchmark_time is not None:
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
490
                self._bench_history.write("%s %s\n" % (
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
491
                    self._formatTime(benchmark_time),
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
492
                    test.id()))
2095.4.1 by Martin Pool
Better progress bars during tests
493
        self.report_success(test)
5340.6.2 by Martin
Replace remaining to unittest.TestResult methods with super
494
        super(ExtendedTestResult, self).addSuccess(test)
3224.4.4 by Andrew Bennetts
Tweak clearing of _log_contents (idea from John).
495
        test._log_contents = ''
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
496
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
497
    def addExpectedFailure(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
498
        self.known_failure_count += 1
499
        self.report_known_failure(test, err)
500
5868.1.2 by Martin
Treat unexpected successes as failures in bzrlib test code
501
    def addUnexpectedSuccess(self, test, details=None):
502
        """Tell result the test unexpectedly passed, counting as a failure
503
504
        When the minimum version of testtools required becomes 0.9.8 this
505
        can be updated to use the new handling there.
506
        """
507
        super(ExtendedTestResult, self).addFailure(test, details=details)
508
        self.failure_count += 1
509
        self.report_unexpected_success(test,
7143.15.2 by Jelmer Vernooij
Run autopep8.
510
                                       "".join(details["reason"].iter_text()))
5868.1.2 by Martin
Treat unexpected successes as failures in bzrlib test code
511
        if self.stop_early:
512
            self.stop()
513
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
514
    def addNotSupported(self, test, feature):
515
        """The test will not be run because of a missing feature.
516
        """
517
        # this can be called in two different ways: it may be that the
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
518
        # test started running, and then raised (through requireFeature)
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
519
        # UnavailableFeature.  Alternatively this method can be called
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
520
        # while probing for features before running the test code proper; in
521
        # that case we will see startTest and stopTest, but the test will
522
        # never actually run.
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
523
        self.unsupported.setdefault(str(feature), 0)
524
        self.unsupported[str(feature)] += 1
525
        self.report_unsupported(test, feature)
526
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
527
    def addSkip(self, test, reason):
528
        """A test has not run for 'reason'."""
529
        self.skip_count += 1
530
        self.report_skip(test, reason)
531
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
532
    def addNotApplicable(self, test, reason):
533
        self.not_applicable_count += 1
534
        self.report_not_applicable(test, reason)
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
535
5340.15.1 by John Arbash Meinel
supersede exc-info branch
536
    def _count_stored_tests(self):
537
        """Count of tests instances kept alive due to not succeeding"""
538
        return self.error_count + self.failure_count + self.known_failure_count
539
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
540
    def _post_mortem(self, tb=None):
4685.1.1 by Robert Collins
Use BZR_TEST_PDB=1 to trigger post_mortems in test failures.
541
        """Start a PDB post mortem session."""
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
542
        if os.environ.get('BRZ_TEST_PDB', None):
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
543
            import pdb
544
            pdb.post_mortem(tb)
4685.1.1 by Robert Collins
Use BZR_TEST_PDB=1 to trigger post_mortems in test failures.
545
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
546
    def progress(self, offset, whence):
547
        """The test is adjusting the count of tests to run."""
4573.2.3 by Robert Collins
Support python 2.4.
548
        if whence == SUBUNIT_SEEK_SET:
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
549
            self.num_tests = offset
4573.2.3 by Robert Collins
Support python 2.4.
550
        elif whence == SUBUNIT_SEEK_CUR:
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
551
            self.num_tests += offset
552
        else:
553
            raise errors.BzrError("Unknown whence %r" % whence)
554
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
555
    def report_tests_starting(self):
556
        """Display information before the test run begins"""
557
        if getattr(sys, 'frozen', None) is None:
558
            bzr_path = osutils.realpath(sys.argv[0])
559
        else:
560
            bzr_path = sys.executable
561
        self.stream.write(
6622.1.30 by Jelmer Vernooij
Some more test fixes.
562
            'brz selftest: %s\n' % (bzr_path,))
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
563
        self.stream.write(
564
            '   %s\n' % (
7143.15.2 by Jelmer Vernooij
Run autopep8.
565
                breezy.__path__[0],))
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
566
        self.stream.write(
567
            '   bzr-%s python-%s %s\n' % (
7143.15.2 by Jelmer Vernooij
Run autopep8.
568
                breezy.version_string,
569
                breezy._format_version_tuple(sys.version_info),
570
                platform.platform(aliased=1),
571
                ))
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
572
        self.stream.write('\n')
573
5412.1.3 by Martin
Add tests for test case thread leak detection
574
    def report_test_start(self, test):
575
        """Display information on the test just about to be run"""
576
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
577
    def _report_thread_leak(self, test, leaked_threads, active_threads):
578
        """Display information on a test that leaked one or more threads"""
5412.1.6 by Martin
Document the less obvious code and note future reporting plans, as requested in review by vila
579
        # GZ 2010-09-09: A leak summary reported separately from the general
580
        #                thread debugging would be nice. Tests under subunit
581
        #                need something not using stream, perhaps adding a
582
        #                testtools details object would be fitting.
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
583
        if 'threads' in selftest_debug_flags:
584
            self.stream.write('%s is leaking, active is now %d\n' %
7143.15.2 by Jelmer Vernooij
Run autopep8.
585
                              (test.id(), len(active_threads)))
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
586
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
587
    def startTestRun(self):
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
588
        self.startTime = time.time()
589
2095.4.1 by Martin Pool
Better progress bars during tests
590
    def report_success(self, test):
591
        pass
592
2658.3.1 by Daniel Watkins
Added ExtendedTestResult.wasStrictlySuccessful.
593
    def wasStrictlySuccessful(self):
594
        if self.unsupported or self.known_failure_count:
595
            return False
596
        return self.wasSuccessful()
597
598
2095.4.1 by Martin Pool
Better progress bars during tests
599
class TextTestResult(ExtendedTestResult):
600
    """Displays progress and results of tests in text form"""
601
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
602
    def __init__(self, stream, descriptions, verbosity,
603
                 bench_history=None,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
604
                 strict=None,
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
605
                 ):
606
        ExtendedTestResult.__init__(self, stream, descriptions, verbosity,
7143.15.2 by Jelmer Vernooij
Run autopep8.
607
                                    bench_history, strict)
4580.3.2 by Martin Pool
TextTestResult now clears off the pb when the tests are done
608
        self.pb = self.ui.nested_progress_bar()
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
609
        self.pb.show_pct = False
610
        self.pb.show_spinner = False
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
611
        self.pb.show_eta = False,
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
612
        self.pb.show_count = False
613
        self.pb.show_bar = False
4580.3.3 by Martin Pool
Test progress bar has zero latency so it's more accurate
614
        self.pb.update_latency = 0
4580.3.5 by Martin Pool
selftest sets ProgressTask.show_transport_activity off
615
        self.pb.show_transport_activity = False
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
616
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
617
    def stopTestRun(self):
4580.3.6 by Martin Pool
TextTestResult should also clear pb before done()
618
        # called when the tests that are going to run have run
619
        self.pb.clear()
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
620
        self.pb.finished()
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
621
        super(TextTestResult, self).stopTestRun()
4580.3.6 by Martin Pool
TextTestResult should also clear pb before done()
622
5425.3.2 by Martin
Delay writing test start reports to inside first test run
623
    def report_tests_starting(self):
624
        super(TextTestResult, self).report_tests_starting()
4103.3.2 by Martin Pool
Remove trailing punctuation from progress messages
625
        self.pb.update('[test 0/%d] Starting' % (self.num_tests))
2095.4.1 by Martin Pool
Better progress bars during tests
626
627
    def _progress_prefix_text(self):
3297.1.1 by Martin Pool
More concise display of test progress bar
628
        # the longer this text, the less space we have to show the test
629
        # name...
630
        a = '[%d' % self.count              # total that have been run
631
        # tests skipped as known not to be relevant are not important enough
632
        # to show here
7143.15.2 by Jelmer Vernooij
Run autopep8.
633
        # if self.skip_count:
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
634
        #     a += ', %d skip' % self.skip_count
7143.15.2 by Jelmer Vernooij
Run autopep8.
635
        # if self.known_failure_count:
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
636
        #     a += '+%dX' % self.known_failure_count
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
637
        if self.num_tests:
7143.15.2 by Jelmer Vernooij
Run autopep8.
638
            a += '/%d' % self.num_tests
3297.1.1 by Martin Pool
More concise display of test progress bar
639
        a += ' in '
640
        runtime = time.time() - self._overall_start_time
641
        if runtime >= 60:
642
            a += '%dm%ds' % (runtime / 60, runtime % 60)
643
        else:
644
            a += '%ds' % runtime
4917.1.1 by Martin Pool
Test progress bar now lumps together tests that error and those that fail
645
        total_fail_count = self.error_count + self.failure_count
646
        if total_fail_count:
647
            a += ', %d failed' % total_fail_count
4721.1.1 by Martin Pool
Stop showing the number of tests due to missing features in the test progress bar.
648
        # if self.unsupported:
649
        #     a += ', %d missing' % len(self.unsupported)
2095.4.3 by Martin Pool
Tweak test display a bit more
650
        a += ']'
2095.4.1 by Martin Pool
Better progress bars during tests
651
        return a
652
653
    def report_test_start(self, test):
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
654
        self.pb.update(
7143.15.2 by Jelmer Vernooij
Run autopep8.
655
            self._progress_prefix_text() +
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
656
            ' ' +
657
            self._shortened_test_description(test))
2095.4.1 by Martin Pool
Better progress bars during tests
658
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
659
    def _test_description(self, test):
2598.4.1 by Martin Pool
Remove obsolete --clean-output, --keep-output, --numbered-dirs selftest options (thanks Alexander)
660
        return self._shortened_test_description(test)
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
661
2095.4.3 by Martin Pool
Tweak test display a bit more
662
    def report_error(self, test, err):
5159.2.1 by Vincent Ladeuil
bzrlib.tests.TextTestResult should use self.stream not ui.note.
663
        self.stream.write('ERROR: %s\n    %s\n' % (
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
664
            self._test_description(test),
2095.4.3 by Martin Pool
Tweak test display a bit more
665
            err[1],
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
666
            ))
2095.4.1 by Martin Pool
Better progress bars during tests
667
2095.4.3 by Martin Pool
Tweak test display a bit more
668
    def report_failure(self, test, err):
5159.2.1 by Vincent Ladeuil
bzrlib.tests.TextTestResult should use self.stream not ui.note.
669
        self.stream.write('FAIL: %s\n    %s\n' % (
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
670
            self._test_description(test),
2095.4.3 by Martin Pool
Tweak test display a bit more
671
            err[1],
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
672
            ))
2095.4.1 by Martin Pool
Better progress bars during tests
673
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
674
    def report_known_failure(self, test, err):
4794.1.15 by Robert Collins
Review feedback.
675
        pass
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
676
5868.1.2 by Martin
Treat unexpected successes as failures in bzrlib test code
677
    def report_unexpected_success(self, test, reason):
678
        self.stream.write('FAIL: %s\n    %s: %s\n' % (
679
            self._test_description(test),
680
            "Unexpected success. Should have failed",
681
            reason,
682
            ))
683
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
684
    def report_skip(self, test, reason):
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
685
        pass
686
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
687
    def report_not_applicable(self, test, reason):
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
688
        pass
2095.4.1 by Martin Pool
Better progress bars during tests
689
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
690
    def report_unsupported(self, test, feature):
691
        """test cannot be run because feature is missing."""
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
692
2095.4.1 by Martin Pool
Better progress bars during tests
693
694
class VerboseTestResult(ExtendedTestResult):
695
    """Produce long output, with one line per test run plus times"""
696
697
    def _ellipsize_to_right(self, a_string, final_width):
698
        """Truncate and pad a string, keeping the right hand side"""
699
        if len(a_string) > final_width:
7143.15.2 by Jelmer Vernooij
Run autopep8.
700
            result = '...' + a_string[3 - final_width:]
2095.4.1 by Martin Pool
Better progress bars during tests
701
        else:
702
            result = a_string
703
        return result.ljust(final_width)
704
5425.3.2 by Martin
Delay writing test start reports to inside first test run
705
    def report_tests_starting(self):
2095.4.1 by Martin Pool
Better progress bars during tests
706
        self.stream.write('running %d tests...\n' % self.num_tests)
5425.3.2 by Martin
Delay writing test start reports to inside first test run
707
        super(VerboseTestResult, self).report_tests_starting()
2095.4.1 by Martin Pool
Better progress bars during tests
708
709
    def report_test_start(self, test):
710
        name = self._shortened_test_description(test)
4747.3.6 by Vincent Ladeuil
terminal_width can now returns None.
711
        width = osutils.terminal_width()
712
        if width is not None:
713
            # width needs space for 6 char status, plus 1 for slash, plus an
714
            # 11-char time string, plus a trailing blank
715
            # when NUMBERED_DIRS: plus 5 chars on test number, plus 1 char on
716
            # space
7143.15.2 by Jelmer Vernooij
Run autopep8.
717
            self.stream.write(self._ellipsize_to_right(name, width - 18))
4747.3.6 by Vincent Ladeuil
terminal_width can now returns None.
718
        else:
719
            self.stream.write(name)
2095.4.1 by Martin Pool
Better progress bars during tests
720
        self.stream.flush()
721
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
722
    def _error_summary(self, err):
723
        indent = ' ' * 4
724
        return '%s%s' % (indent, err[1])
725
2095.4.3 by Martin Pool
Tweak test display a bit more
726
    def report_error(self, test, err):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
727
        self.stream.write('ERROR %s\n%s\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
728
                          % (self._testTimeString(test),
729
                             self._error_summary(err)))
2095.4.1 by Martin Pool
Better progress bars during tests
730
2095.4.3 by Martin Pool
Tweak test display a bit more
731
    def report_failure(self, test, err):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
732
        self.stream.write(' FAIL %s\n%s\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
733
                          % (self._testTimeString(test),
734
                             self._error_summary(err)))
2095.4.1 by Martin Pool
Better progress bars during tests
735
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
736
    def report_known_failure(self, test, err):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
737
        self.stream.write('XFAIL %s\n%s\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
738
                          % (self._testTimeString(test),
739
                             self._error_summary(err)))
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
740
5868.1.2 by Martin
Treat unexpected successes as failures in bzrlib test code
741
    def report_unexpected_success(self, test, reason):
742
        self.stream.write(' FAIL %s\n%s: %s\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
743
                          % (self._testTimeString(test),
744
                             "Unexpected success. Should have failed",
745
                             reason))
5868.1.2 by Martin
Treat unexpected successes as failures in bzrlib test code
746
2095.4.1 by Martin Pool
Better progress bars during tests
747
    def report_success(self, test):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
748
        self.stream.write('   OK %s\n' % self._testTimeString(test))
2095.4.1 by Martin Pool
Better progress bars during tests
749
        for bench_called, stats in getattr(test, '_benchcalls', []):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
750
            self.stream.write('LSProf output for %s(%s, %s)\n' % bench_called)
2095.4.1 by Martin Pool
Better progress bars during tests
751
            stats.pprint(file=self.stream)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
752
        # flush the stream so that we get smooth output. This verbose mode is
753
        # used to show the output in PQM.
2095.4.1 by Martin Pool
Better progress bars during tests
754
        self.stream.flush()
755
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
756
    def report_skip(self, test, reason):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
757
        self.stream.write(' SKIP %s\n%s\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
758
                          % (self._testTimeString(test), reason))
2095.4.1 by Martin Pool
Better progress bars during tests
759
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
760
    def report_not_applicable(self, test, reason):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
761
        self.stream.write('  N/A %s\n    %s\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
762
                          % (self._testTimeString(test), reason))
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
763
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
764
    def report_unsupported(self, test, feature):
765
        """test cannot be run because feature is missing."""
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
766
        self.stream.write("NODEP %s\n    The feature '%s' is not available.\n"
7143.15.2 by Jelmer Vernooij
Run autopep8.
767
                          % (self._testTimeString(test), feature))
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
768
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
769
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
770
class TextTestRunner(object):
1185.16.58 by mbp at sourcefrog
- run all selftests by default
771
    stop_on_failure = False
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
772
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
773
    def __init__(self,
774
                 stream=sys.stderr,
775
                 descriptions=0,
776
                 verbosity=1,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
777
                 bench_history=None,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
778
                 strict=False,
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
779
                 result_decorators=None,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
780
                 ):
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
781
        """Create a TextTestRunner.
782
783
        :param result_decorators: An optional list of decorators to apply
784
            to the result object being used by the runner. Decorators are
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
785
            applied left to right - the first element in the list is the
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
786
            innermost decorator.
787
        """
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
788
        # stream may know claim to know to write unicode strings, but in older
789
        # pythons this goes sufficiently wrong that it is a bad idea. (
790
        # specifically a built in file with encoding 'UTF-8' will still try
791
        # to encode using ascii.
792
        new_encoding = osutils.get_terminal_encoding()
4794.1.12 by Robert Collins
Create a StreamWriter helper that doesn't trigger implicit decode('ascii') on write(a_str).
793
        codec = codecs.lookup(new_encoding)
6691.1.3 by Jelmer Vernooij
Drop python2.4 compatibility for encoding in selftest.
794
        encode = codec.encode
5410.2.1 by Martin
Escape unprintable test result output rather than aborting selftest
795
        # GZ 2010-09-08: Really we don't want to be writing arbitrary bytes,
796
        #                so should swap to the plain codecs.StreamWriter
797
        stream = osutils.UnicodeOrBytesToBytesWriter(encode, stream,
7143.15.2 by Jelmer Vernooij
Run autopep8.
798
                                                     "backslashreplace")
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
799
        stream.encoding = new_encoding
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
800
        self.stream = stream
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
801
        self.descriptions = descriptions
802
        self.verbosity = verbosity
1819.1.2 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Add a benchmark output parameter to TextTestRunner.
803
        self._bench_history = bench_history
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
804
        self._strict = strict
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
805
        self._result_decorators = result_decorators or []
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
806
807
    def run(self, test):
808
        "Run the given test case or test suite."
2095.4.1 by Martin Pool
Better progress bars during tests
809
        if self.verbosity == 1:
810
            result_class = TextTestResult
811
        elif self.verbosity >= 2:
812
            result_class = VerboseTestResult
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
813
        original_result = result_class(self.stream,
7143.15.2 by Jelmer Vernooij
Run autopep8.
814
                                       self.descriptions,
815
                                       self.verbosity,
816
                                       bench_history=self._bench_history,
817
                                       strict=self._strict,
818
                                       )
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
819
        # Signal to result objects that look at stop early policy to stop,
820
        original_result.stop_early = self.stop_on_failure
821
        result = original_result
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
822
        for decorator in self._result_decorators:
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
823
            result = decorator(result)
824
            result.stop_early = self.stop_on_failure
825
        result.startTestRun()
826
        try:
827
            test.run(result)
828
        finally:
829
            result.stopTestRun()
830
        # higher level code uses our extended protocol to determine
831
        # what exit code to give.
832
        return original_result
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
833
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
834
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
835
def iter_suite_tests(suite):
836
    """Return all tests in a suite, recursing through nested suites"""
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
837
    if isinstance(suite, unittest.TestCase):
838
        yield suite
839
    elif isinstance(suite, unittest.TestSuite):
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
840
        for item in suite:
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
841
            for r in iter_suite_tests(item):
842
                yield r
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
843
    else:
844
        raise Exception('unknown type %r for object %r'
845
                        % (type(suite), suite))
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
846
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
847
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
848
TestSkipped = testtools.testcase.TestSkipped
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
849
850
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
851
class TestNotApplicable(TestSkipped):
852
    """A test is not applicable to the situation where it was run.
853
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
854
    This is only normally raised by parameterized tests, if they find that
855
    the instance they're constructed upon does not support one aspect
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
856
    of its interface.
857
    """
858
859
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
860
# traceback._some_str fails to format exceptions that have the default
861
# __str__ which does an implicit ascii conversion. However, repr() on those
862
# objects works, for all that its not quite what the doctor may have ordered.
863
def _clever_some_str(value):
864
    try:
865
        return str(value)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
866
    except BaseException:
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
867
        try:
868
            return repr(value).replace('\\n', '\n')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
869
        except BaseException:
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
870
            return '<unprintable %s object>' % type(value).__name__
871
7143.15.2 by Jelmer Vernooij
Run autopep8.
872
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
873
traceback._some_str = _clever_some_str
874
875
4794.1.16 by Robert Collins
Clearer comment on KnownFailure deprecation.
876
# deprecated - use self.knownFailure(), or self.expectFailure.
4794.1.15 by Robert Collins
Review feedback.
877
KnownFailure = testtools.testcase._ExpectedFailure
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
878
879
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
880
class UnavailableFeature(Exception):
881
    """A feature required for this test was not available.
882
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
883
    This can be considered a specialised form of SkippedTest.
884
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
885
    The feature should be used to construct the exception.
886
    """
887
888
6621.22.1 by Martin
Refactor bzrlib.ui to be based on unicode streams
889
class StringIOWrapper(ui_testing.BytesIOWithEncoding):
890
6630.1.1 by Jelmer Vernooij
Remove deprecated functionality.
891
    @symbol_versioning.deprecated_method(
892
        symbol_versioning.deprecated_in((3, 0)))
1185.85.8 by John Arbash Meinel
Adding wrapper for sys.stdout so we can set the output encoding. Adding tests that 'bzr log' handles multiple encodings properly
893
    def __init__(self, s=None):
6621.22.1 by Martin
Refactor bzrlib.ui to be based on unicode streams
894
        super(StringIOWrapper, self).__init__(s)
895
896
897
TestUIFactory = ui_testing.TestUIFactory
4463.1.2 by Martin Pool
merge trunk
898
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
899
5574.6.8 by Vincent Ladeuil
Fix typo, rename BzrDocTestSuite to IsolatedDocTestSuite to dodge the name space controversy and make the intent clearer, add an indirection for setUp/tearDown to prepare more isolation for doctests.
900
def isolated_doctest_setUp(test):
901
    override_os_environ(test)
6793.3.1 by Jelmer Vernooij
Prevent leaking of BRZ_HOME into doctests.
902
    osutils.set_or_unset_env('BRZ_HOME', '/nonexistent')
6621.19.1 by Martin
Isolate bd. tests properly to prevent test progress kipple
903
    test._orig_ui_factory = ui.ui_factory
904
    ui.ui_factory = ui.SilentUIFactory()
5574.6.8 by Vincent Ladeuil
Fix typo, rename BzrDocTestSuite to IsolatedDocTestSuite to dodge the name space controversy and make the intent clearer, add an indirection for setUp/tearDown to prepare more isolation for doctests.
905
906
907
def isolated_doctest_tearDown(test):
908
    restore_os_environ(test)
6621.19.1 by Martin
Isolate bd. tests properly to prevent test progress kipple
909
    ui.ui_factory = test._orig_ui_factory
5574.6.8 by Vincent Ladeuil
Fix typo, rename BzrDocTestSuite to IsolatedDocTestSuite to dodge the name space controversy and make the intent clearer, add an indirection for setUp/tearDown to prepare more isolation for doctests.
910
911
912
def IsolatedDocTestSuite(*args, **kwargs):
5574.7.3 by Vincent Ladeuil
Some test infrastructure for tests.DocTestSuite.
913
    """Overrides doctest.DocTestSuite to handle isolation.
914
915
    The method is really a factory and users are expected to use it as such.
916
    """
5984.1.4 by Vincent Ladeuil
Make the test framework more robust against BZR_LOG leaks.
917
5574.6.8 by Vincent Ladeuil
Fix typo, rename BzrDocTestSuite to IsolatedDocTestSuite to dodge the name space controversy and make the intent clearer, add an indirection for setUp/tearDown to prepare more isolation for doctests.
918
    kwargs['setUp'] = isolated_doctest_setUp
919
    kwargs['tearDown'] = isolated_doctest_tearDown
5574.7.3 by Vincent Ladeuil
Some test infrastructure for tests.DocTestSuite.
920
    return doctest.DocTestSuite(*args, **kwargs)
921
922
4794.1.1 by Robert Collins
Derive bzr's TestCase from testtools.testcase.TestCase.
923
class TestCase(testtools.TestCase):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
924
    """Base class for brz unit tests.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
925
926
    Tests that need access to disk resources should subclass
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
927
    TestCaseInTempDir not TestCase.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
928
929
    Error and debug log messages are redirected from their usual
930
    location into a temporary file, the contents of which can be
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
931
    retrieved by _get_log().  We use a real OS file, not an in-memory object,
932
    so that it can also capture file IO.  When the test completes this file
933
    is read into memory and removed from disk.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
934
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
935
    There are also convenience functions to invoke bzr's command-line
6622.1.30 by Jelmer Vernooij
Some more test fixes.
936
    routine, and to build and check brz trees.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
937
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
938
    In addition to the usual method of overriding tearDown(), this class also
5425.2.2 by Andrew Bennetts
Remove addCleanup (testtools implements this for us), remove some unused imports.
939
    allows subclasses to register cleanup functions via addCleanup, which are
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
940
    run in order as the object is torn down.  It's less likely this will be
941
    accidentally overlooked.
942
    """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
943
5404.1.1 by Andrew Bennetts
Use StringIO rather than real files on disk for log files in tests.
944
    _log_file = None
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
945
    # record lsprof data when performing benchmark calls.
946
    _gather_lsprof_in_benchmarks = False
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
947
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
948
    def __init__(self, methodName='testMethod'):
949
        super(TestCase, self).__init__(methodName)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
950
        self._directory_isolation = True
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
951
        self.exception_handlers.insert(
952
            0, (UnavailableFeature, self._do_unsupported_or_skip))
953
        self.exception_handlers.insert(
954
            0, (TestNotApplicable, self._do_not_applicable))
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
955
956
    def setUp(self):
957
        super(TestCase, self).setUp()
6319.1.1 by Martin Pool
Add selftest.timeout option, defaulting to 600
958
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
959
        # At this point we're still accessing the config files in $BRZ_HOME (as
6499.3.9 by Vincent Ladeuil
Provide fresh config stores for tests.
960
        # set by the user running selftest).
6319.1.3 by Martin Pool
Cope if no selftest.timeout is set
961
        timeout = config.GlobalStack().get('selftest.timeout')
962
        if timeout:
963
            timeout_fixture = fixtures.TimeoutFixture(timeout)
964
            timeout_fixture.setUp()
965
            self.addCleanup(timeout_fixture.cleanUp)
6319.1.1 by Martin Pool
Add selftest.timeout option, defaulting to 600
966
6319.1.4 by Martin Pool
Set up test timeouts before configuring features
967
        for feature in getattr(self, '_test_needs_features', []):
968
            self.requireFeature(feature)
969
        self._cleanEnvironment()
970
6759.4.2 by Jelmer Vernooij
Use get_global_state>
971
        self.overrideAttr(breezy.get_global_state(), 'cmdline_overrides',
972
                          config.CommandLineStore())
6319.1.1 by Martin Pool
Add selftest.timeout option, defaulting to 600
973
2095.4.1 by Martin Pool
Better progress bars during tests
974
        self._silenceUI()
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
975
        self._startLogFile()
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
976
        self._benchcalls = []
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
977
        self._benchtime = None
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
978
        self._clear_hooks()
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
979
        self._track_transports()
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
980
        self._track_locks()
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
981
        self._clear_debug_flags()
5463.1.1 by Martin Pool
Isolate bzrlib.trace._verbosity_level per test case
982
        # Isolate global verbosity level, to make sure it's reproducible
983
        # between tests.  We should get rid of this altogether: bug 656694. --
984
        # mbp 20101008
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
985
        self.overrideAttr(breezy.trace, '_verbosity_level', 0)
5923.2.3 by Andrew Bennetts
Make a nice helper method rather than using a closure, cope better with multiple subprocesses, and add a release-notes entry.
986
        self._log_files = set()
5743.14.13 by Vincent Ladeuil
Some more doc and tests.
987
        # Each key in the ``_counters`` dict holds a value for a different
5743.14.19 by Vincent Ladeuil
Cleanup.
988
        # counter. When the test ends, addDetail() should be used to output the
989
        # counter values. This happens in install_counter_hook().
5743.15.1 by Martin
Poke machinery of counter stats in selftest
990
        self._counters = {}
5743.14.2 by Vincent Ladeuil
Rough implementation to output config stats via the subunit AddDetail API.
991
        if 'config_stats' in selftest_debug_flags:
992
            self._install_config_stats_hooks()
6131.1.1 by Jonathan Riddell
do not use i18n in tests
993
        # Do not use i18n for tests (unless the test reverses this)
6133.3.13 by Jonathan Riddell
vila sorts it out, fix disable_i18n() and use it in tests.__init__
994
        i18n.disable_i18n()
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
995
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
996
    def debug(self):
997
        # debug a frame up.
998
        import pdb
6082.3.2 by Vincent Ladeuil
Simplify and fix test.debug too.
999
        # The sys preserved stdin/stdout should allow blackbox tests debugging
1000
        pdb.Pdb(stdin=sys.__stdin__, stdout=sys.__stdout__
1001
                ).set_trace(sys._getframe().f_back)
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1002
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1003
    def discardDetail(self, name):
1004
        """Extend the addDetail, getDetails api so we can remove a detail.
1005
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1006
        eg. brz always adds the 'log' detail at startup, but we don't want to
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1007
        include it for skipped, xfail, etc tests.
1008
1009
        It is safe to call this for a detail that doesn't exist, in case this
1010
        gets called multiple times.
1011
        """
1012
        # We cheat. details is stored in __details which means we shouldn't
1013
        # touch it. but getDetails() returns the dict directly, so we can
1014
        # mutate it.
1015
        details = self.getDetails()
1016
        if name in details:
1017
            del details[name]
1018
5743.14.10 by Vincent Ladeuil
Extract install_counter_hook for clarity and possible reuse
1019
    def install_counter_hook(self, hooks, name, counter_name=None):
1020
        """Install a counting hook.
1021
1022
        Any hook can be counted as long as it doesn't need to return a value.
1023
1024
        :param hooks: Where the hook should be installed.
1025
1026
        :param name: The hook name that will be counted.
1027
1028
        :param counter_name: The counter identifier in ``_counters``, defaults
1029
            to ``name``.
1030
        """
7143.15.2 by Jelmer Vernooij
Run autopep8.
1031
        _counters = self._counters  # Avoid closing over self
5743.14.10 by Vincent Ladeuil
Extract install_counter_hook for clarity and possible reuse
1032
        if counter_name is None:
1033
            counter_name = name
6619.3.1 by Jelmer Vernooij
Apply 2to3 has_key fix.
1034
        if counter_name in _counters:
5743.14.10 by Vincent Ladeuil
Extract install_counter_hook for clarity and possible reuse
1035
            raise AssertionError('%s is already used as a counter name'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1036
                                 % (counter_name,))
5743.15.1 by Martin
Poke machinery of counter stats in selftest
1037
        _counters[counter_name] = 0
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1038
        self.addDetail(counter_name, content.Content(
1039
            content.UTF8_TEXT,
1040
            lambda: [b'%d' % (_counters[counter_name],)]))
7143.15.2 by Jelmer Vernooij
Run autopep8.
1041
5743.15.1 by Martin
Poke machinery of counter stats in selftest
1042
        def increment_counter(*args, **kwargs):
1043
            _counters[counter_name] += 1
5743.14.10 by Vincent Ladeuil
Extract install_counter_hook for clarity and possible reuse
1044
        label = 'count %s calls' % (counter_name,)
5743.15.1 by Martin
Poke machinery of counter stats in selftest
1045
        hooks.install_named_hook(name, increment_counter, label)
5743.14.10 by Vincent Ladeuil
Extract install_counter_hook for clarity and possible reuse
1046
        self.addCleanup(hooks.uninstall_named_hook, name, label)
1047
5743.14.2 by Vincent Ladeuil
Rough implementation to output config stats via the subunit AddDetail API.
1048
    def _install_config_stats_hooks(self):
1049
        """Install config hooks to count hook calls.
1050
1051
        """
5743.14.8 by Vincent Ladeuil
Catch-up with separate hooks for old and new config
1052
        for hook_name in ('get', 'set', 'remove', 'load', 'save'):
5743.14.10 by Vincent Ladeuil
Extract install_counter_hook for clarity and possible reuse
1053
            self.install_counter_hook(config.ConfigHooks, hook_name,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1054
                                      'config.%s' % (hook_name,))
5743.14.8 by Vincent Ladeuil
Catch-up with separate hooks for old and new config
1055
1056
        # The OldConfigHooks are private and need special handling to protect
1057
        # against recursive tests (tests that run other tests), so we just do
1058
        # manually what registering them into _builtin_known_hooks will provide
1059
        # us.
1060
        self.overrideAttr(config, 'OldConfigHooks', config._OldConfigHooks())
1061
        for hook_name in ('get', 'set', 'remove', 'load', 'save'):
5743.14.10 by Vincent Ladeuil
Extract install_counter_hook for clarity and possible reuse
1062
            self.install_counter_hook(config.OldConfigHooks, hook_name,
1063
                                      'old_config.%s' % (hook_name,))
5743.14.2 by Vincent Ladeuil
Rough implementation to output config stats via the subunit AddDetail API.
1064
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1065
    def _clear_debug_flags(self):
1066
        """Prevent externally set debug flags affecting tests.
3882.6.20 by John Arbash Meinel
Clear out the InventoryEntry caches as part of the test suite.
1067
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1068
        Tests that want to use debug flags can just set them in the
1069
        debug_flags set during setup/teardown.
1070
        """
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
1071
        # Start with a copy of the current debug flags we can safely modify.
1072
        self.overrideAttr(debug, 'debug_flags', set(debug.debug_flags))
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
1073
        if 'allow_debug' not in selftest_debug_flags:
3302.2.1 by Andrew Bennetts
Add -Dselftest_debug debug flag.
1074
            debug.debug_flags.clear()
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1075
        if 'disable_lock_checks' not in selftest_debug_flags:
1076
            debug.debug_flags.add('strict_locks')
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
1077
1078
    def _clear_hooks(self):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1079
        # prevent hooks affecting tests
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
1080
        known_hooks = hooks.known_hooks
4119.3.1 by Robert Collins
Create a single registry of all Hooks classes, removing the test suite knowledge of such hooks and allowing plugins to sensibly and safely define new hooks.
1081
        self._preserved_hooks = {}
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
1082
        for key, (parent, name) in known_hooks.iter_parent_objects():
1083
            current_hooks = getattr(parent, name)
4119.3.1 by Robert Collins
Create a single registry of all Hooks classes, removing the test suite knowledge of such hooks and allowing plugins to sensibly and safely define new hooks.
1084
            self._preserved_hooks[parent] = (name, current_hooks)
5622.3.4 by Jelmer Vernooij
clear/store lazy hooks during tests too.
1085
        self._preserved_lazy_hooks = hooks._lazy_hooks
1086
        hooks._lazy_hooks = {}
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1087
        self.addCleanup(self._restoreHooks)
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
1088
        for key, (parent, name) in known_hooks.iter_parent_objects():
1089
            factory = known_hooks.get(key)
5622.3.9 by Jelmer Vernooij
Revert unnecessary changes.
1090
            setattr(parent, name, factory())
4160.2.4 by Andrew Bennetts
Use BzrDir pre_open hook to jail request code from accessing transports other than the backing transport.
1091
        # this hook should always be installed
1092
        request._install_hook()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1093
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1094
    def disable_directory_isolation(self):
1095
        """Turn off directory isolation checks."""
1096
        self._directory_isolation = False
1097
1098
    def enable_directory_isolation(self):
1099
        """Enable directory isolation checks."""
1100
        self._directory_isolation = True
1101
2095.4.1 by Martin Pool
Better progress bars during tests
1102
    def _silenceUI(self):
1103
        """Turn off UI for duration of test"""
1104
        # by default the UI is off; tests can turn it on if they want it.
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
1105
        self.overrideAttr(ui, 'ui_factory', ui.SilentUIFactory())
2095.4.1 by Martin Pool
Better progress bars during tests
1106
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
1107
    def _check_locks(self):
1108
        """Check that all lock take/release actions have been paired."""
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
1109
        # We always check for mismatched locks. If a mismatch is found, we
1110
        # fail unless -Edisable_lock_checks is supplied to selftest, in which
1111
        # case we just print a warning.
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
1112
        # unhook:
1113
        acquired_locks = [lock for action, lock in self._lock_actions
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
1114
                          if action == 'acquired']
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
1115
        released_locks = [lock for action, lock in self._lock_actions
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
1116
                          if action == 'released']
1117
        broken_locks = [lock for action, lock in self._lock_actions
1118
                        if action == 'broken']
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
1119
        # trivially, given the tests for lock acquistion and release, if we
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
1120
        # have as many in each list, it should be ok. Some lock tests also
1121
        # break some locks on purpose and should be taken into account by
1122
        # considering that breaking a lock is just a dirty way of releasing it.
1123
        if len(acquired_locks) != (len(released_locks) + len(broken_locks)):
5425.4.12 by Martin Pool
More readable message about mismatched locks in tests
1124
            message = (
1125
                'Different number of acquired and '
1126
                'released or broken locks.\n'
1127
                'acquired=%s\n'
1128
                'released=%s\n'
1129
                'broken=%s\n' %
1130
                (acquired_locks, released_locks, broken_locks))
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
1131
            if not self._lock_check_thorough:
1132
                # Rather than fail, just warn
6619.3.3 by Jelmer Vernooij
Apply 2to3 print fix.
1133
                print("Broken test %s: %s" % (self, message))
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
1134
                return
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
1135
            self.fail(message)
1136
1137
    def _track_locks(self):
1138
        """Track lock activity during tests."""
1139
        self._lock_actions = []
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
1140
        if 'disable_lock_checks' in selftest_debug_flags:
1141
            self._lock_check_thorough = False
1142
        else:
1143
            self._lock_check_thorough = True
4985.2.1 by Vincent Ladeuil
Deploy addAttrCleanup on the whole test suite.
1144
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
1145
        self.addCleanup(self._check_locks)
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
1146
        _mod_lock.Lock.hooks.install_named_hook('lock_acquired',
1147
                                                self._lock_acquired, None)
1148
        _mod_lock.Lock.hooks.install_named_hook('lock_released',
1149
                                                self._lock_released, None)
1150
        _mod_lock.Lock.hooks.install_named_hook('lock_broken',
1151
                                                self._lock_broken, None)
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
1152
1153
    def _lock_acquired(self, result):
1154
        self._lock_actions.append(('acquired', result))
1155
1156
    def _lock_released(self, result):
1157
        self._lock_actions.append(('released', result))
1158
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
1159
    def _lock_broken(self, result):
1160
        self._lock_actions.append(('broken', result))
1161
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1162
    def permit_dir(self, name):
1163
        """Permit a directory to be used by this test. See permit_url."""
6039.1.5 by Jelmer Vernooij
Add get_transport_from_url and get_transport_from_path functions.
1164
        name_transport = _mod_transport.get_transport_from_path(name)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1165
        self.permit_url(name)
1166
        self.permit_url(name_transport.base)
1167
1168
    def permit_url(self, url):
1169
        """Declare that url is an ok url to use in this test.
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1170
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1171
        Do this for memory transports, temporary test directory etc.
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1172
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1173
        Do not do this for the current working directory, /tmp, or any other
1174
        preexisting non isolated url.
1175
        """
1176
        if not url.endswith('/'):
1177
            url += '/'
1178
        self._bzr_selftest_roots.append(url)
1179
1180
    def permit_source_tree_branch_repo(self):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1181
        """Permit the source tree brz is running from to be opened.
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1182
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
1183
        Some code such as breezy.version attempts to read from the brz branch
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1184
        that brz is executing from (if any). This method permits that directory
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1185
        to be used in the test suite.
1186
        """
1187
        path = self.get_source_path()
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1188
        self.record_directory_isolation()
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1189
        try:
1190
            try:
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1191
                workingtree.WorkingTree.open(path)
4691.2.4 by Robert Collins
Handle NotBranchError when looking up source tree.
1192
            except (errors.NotBranchError, errors.NoWorkingTree):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1193
                raise TestSkipped('Needs a working tree of brz sources')
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1194
        finally:
1195
            self.enable_directory_isolation()
1196
1197
    def _preopen_isolate_transport(self, transport):
1198
        """Check that all transport openings are done in the test work area."""
4634.43.20 by Andrew Bennetts
Merge from bzr.dev, resolving conflicts.
1199
        while isinstance(transport, pathfilter.PathFilteringTransport):
1200
            # Unwrap pathfiltered transports
1201
            transport = transport.server.backing_transport.clone(
1202
                transport._filter('.'))
1203
        url = transport.base
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1204
        # ReadonlySmartTCPServer_for_testing decorates the backing transport
1205
        # urls it is given by prepending readonly+. This is appropriate as the
1206
        # client shouldn't know that the server is readonly (or not readonly).
1207
        # We could register all servers twice, with readonly+ prepending, but
1208
        # that makes for a long list; this is about the same but easier to
1209
        # read.
1210
        if url.startswith('readonly+'):
1211
            url = url[len('readonly+'):]
1212
        self._preopen_isolate_url(url)
1213
1214
    def _preopen_isolate_url(self, url):
1215
        if not self._directory_isolation:
1216
            return
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1217
        if self._directory_isolation == 'record':
1218
            self._bzr_selftest_roots.append(url)
1219
            return
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1220
        # This prevents all transports, including e.g. sftp ones backed on disk
1221
        # from working unless they are explicitly granted permission. We then
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1222
        # depend on the code that sets up test transports to check that they
1223
        # are appropriately isolated and enable their use by calling
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1224
        # self.permit_transport()
1225
        if not osutils.is_inside_any(self._bzr_selftest_roots, url):
1226
            raise errors.BzrError("Attempt to escape test isolation: %r %r"
7143.15.2 by Jelmer Vernooij
Run autopep8.
1227
                                  % (url, self._bzr_selftest_roots))
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1228
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1229
    def record_directory_isolation(self):
1230
        """Gather accessed directories to permit later access.
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1231
1232
        This is used for tests that access the branch brz is running from.
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1233
        """
1234
        self._directory_isolation = "record"
1235
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
1236
    def start_server(self, transport_server, backing_server=None):
1237
        """Start transport_server for this test.
1238
1239
        This starts the server, registers a cleanup for it and permits the
1240
        server's urls to be used.
1241
        """
1242
        if backing_server is None:
4934.3.3 by Martin Pool
Rename Server.setUp to Server.start_server
1243
            transport_server.start_server()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
1244
        else:
4934.3.3 by Martin Pool
Rename Server.setUp to Server.start_server
1245
            transport_server.start_server(backing_server)
4934.3.1 by Martin Pool
Rename Server.tearDown to .stop_server
1246
        self.addCleanup(transport_server.stop_server)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1247
        # Obtain a real transport because if the server supplies a password, it
1248
        # will be hidden from the base on the client side.
6039.1.5 by Jelmer Vernooij
Add get_transport_from_url and get_transport_from_path functions.
1249
        t = _mod_transport.get_transport_from_url(transport_server.get_url())
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1250
        # Some transport servers effectively chroot the backing transport;
1251
        # others like SFTPServer don't - users of the transport can walk up the
1252
        # transport to read the entire backing transport. This wouldn't matter
1253
        # except that the workdir tests are given - and that they expect the
1254
        # server's url to point at - is one directory under the safety net. So
1255
        # Branch operations into the transport will attempt to walk up one
1256
        # directory. Chrooting all servers would avoid this but also mean that
1257
        # we wouldn't be testing directly against non-root urls. Alternatively
1258
        # getting the test framework to start the server with a backing server
1259
        # at the actual safety net directory would work too, but this then
1260
        # means that the self.get_url/self.get_transport methods would need
1261
        # to transform all their results. On balance its cleaner to handle it
1262
        # here, and permit a higher url when we have one of these transports.
1263
        if t.base.endswith('/work/'):
1264
            # we have safety net/test root/work
1265
            t = t.clone('../..')
5017.3.18 by Vincent Ladeuil
Move SmartTCPServer_for_testing and friends to bzrlib.tests.test_server
1266
        elif isinstance(transport_server,
1267
                        test_server.SmartTCPServer_for_testing):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1268
            # The smart server adds a path similar to work, which is traversed
1269
            # up from by the client. But the server is chrooted - the actual
1270
            # backing transport is not escaped from, and VFS requests to the
1271
            # root will error (because they try to escape the chroot).
1272
            t2 = t.clone('..')
1273
            while t2.base != t.base:
1274
                t = t2
1275
                t2 = t.clone('..')
1276
        self.permit_url(t.base)
1277
1278
    def _track_transports(self):
1279
        """Install checks for transport usage."""
1280
        # TestCase has no safe place it can write to.
1281
        self._bzr_selftest_roots = []
1282
        # Currently the easiest way to be sure that nothing is going on is to
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1283
        # hook into brz dir opening. This leaves a small window of error for
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1284
        # transport tests, but they are well known, and we can improve on this
1285
        # step.
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1286
        controldir.ControlDir.hooks.install_named_hook(
1287
            "pre_open", self._preopen_isolate_transport,
1288
            "Check brz directories are safe.")
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
1289
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
1290
    def _ndiff_strings(self, a, b):
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
1291
        """Return ndiff between two strings containing lines.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1292
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
1293
        A trailing newline is added if missing to make the strings
1294
        print properly."""
7045.4.29 by Jelmer Vernooij
Fix some merge tests.
1295
        if b and not b.endswith('\n'):
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
1296
            b += '\n'
7045.4.29 by Jelmer Vernooij
Fix some merge tests.
1297
        if a and not a.endswith('\n'):
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
1298
            a += '\n'
1185.16.21 by Martin Pool
- tweak diff shown by assertEqualDiff
1299
        difflines = difflib.ndiff(a.splitlines(True),
1300
                                  b.splitlines(True),
1301
                                  linejunk=lambda x: False,
1302
                                  charjunk=lambda x: False)
1303
        return ''.join(difflines)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1304
2255.2.190 by Martin Pool
assertEqual can take an option message
1305
    def assertEqual(self, a, b, message=''):
2360.1.2 by John Arbash Meinel
Add an overzealous test, for Unicode support of _iter_changes.
1306
        try:
1307
            if a == b:
1308
                return
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
1309
        except UnicodeError as e:
2360.1.2 by John Arbash Meinel
Add an overzealous test, for Unicode support of _iter_changes.
1310
            # If we can't compare without getting a UnicodeError, then
1311
            # obviously they are different
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
1312
            trace.mutter('UnicodeError: %s', e)
2255.2.190 by Martin Pool
assertEqual can take an option message
1313
        if message:
1314
            message += '\n'
1315
        raise AssertionError("%snot equal:\na = %s\nb = %s\n"
7143.15.2 by Jelmer Vernooij
Run autopep8.
1316
                             % (message,
1317
                                pprint.pformat(a), pprint.pformat(b)))
2255.2.185 by Martin Pool
assertEqual uses pformat to show results
1318
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1319
    # FIXME: This is deprecated in unittest2 but plugins may still use it so we
1320
    # need a deprecation period for them -- vila 2016-02-01
2255.2.185 by Martin Pool
assertEqual uses pformat to show results
1321
    assertEquals = assertEqual
1322
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
1323
    def assertEqualDiff(self, a, b, message=None):
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
1324
        """Assert two texts are equal, if not raise an exception.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1325
1326
        This is intended for use with multi-line strings where it can
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
1327
        be hard to find the differences by eye.
1328
        """
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1329
        # TODO: perhaps override assertEqual to call this for strings?
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
1330
        if a == b:
1331
            return
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
1332
        if message is None:
1333
            message = "texts not equal:\n"
7045.4.29 by Jelmer Vernooij
Fix some merge tests.
1334
        if a + ('\n' if isinstance(a, text_type) else b'\n') == b:
4680.1.1 by Vincent Ladeuil
Surprisingly, assertEqualDiff was wrong.
1335
            message = 'first string is missing a final newline.\n'
7045.4.29 by Jelmer Vernooij
Fix some merge tests.
1336
        if a == b + ('\n' if isinstance(b, text_type) else b'\n'):
4680.1.2 by Vincent Ladeuil
Blessed be the tests that protect the imprudent :)
1337
            message = 'second string is missing a final newline.\n'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1338
        raise AssertionError(message
7290.46.1 by Jelmer Vernooij
Add custom generator for XML revisions.
1339
                             + self._ndiff_strings(
1340
                                 a if isinstance(a, text_type) else a.decode(),
1341
                                 b if isinstance(b, text_type) else b.decode()))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1342
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
1343
    def assertEqualMode(self, mode, mode_test):
1344
        self.assertEqual(mode, mode_test,
1345
                         'mode mismatch %o != %o' % (mode, mode_test))
1346
4807.2.2 by John Arbash Meinel
Move all the stat comparison and platform checkning code to assertEqualStat.
1347
    def assertEqualStat(self, expected, actual):
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
1348
        """assert that expected and actual are the same stat result.
1349
1350
        :param expected: A stat result.
1351
        :param actual: A stat result.
1352
        :raises AssertionError: If the expected and actual stat values differ
1353
            other than by atime.
1354
        """
4789.24.1 by John Arbash Meinel
os.lstat() != os.fstat() for the st_ino field on windows
1355
        self.assertEqual(expected.st_size, actual.st_size,
1356
                         'st_size did not match')
1357
        self.assertEqual(expected.st_mtime, actual.st_mtime,
1358
                         'st_mtime did not match')
1359
        self.assertEqual(expected.st_ctime, actual.st_ctime,
1360
                         'st_ctime did not match')
5609.29.6 by John Arbash Meinel
Change the stat assertions to be sure that we are catching the callers correctly.
1361
        if sys.platform == 'win32':
4807.2.2 by John Arbash Meinel
Move all the stat comparison and platform checkning code to assertEqualStat.
1362
            # On Win32 both 'dev' and 'ino' cannot be trusted. In python2.4 it
1363
            # is 'dev' that varies, in python 2.5 (6?) it is st_ino that is
5609.29.6 by John Arbash Meinel
Change the stat assertions to be sure that we are catching the callers correctly.
1364
            # odd. We just force it to always be 0 to avoid any problems.
1365
            self.assertEqual(0, expected.st_dev)
1366
            self.assertEqual(0, actual.st_dev)
1367
            self.assertEqual(0, expected.st_ino)
1368
            self.assertEqual(0, actual.st_ino)
1369
        else:
4807.2.2 by John Arbash Meinel
Move all the stat comparison and platform checkning code to assertEqualStat.
1370
            self.assertEqual(expected.st_dev, actual.st_dev,
1371
                             'st_dev did not match')
4789.24.1 by John Arbash Meinel
os.lstat() != os.fstat() for the st_ino field on windows
1372
            self.assertEqual(expected.st_ino, actual.st_ino,
1373
                             'st_ino did not match')
1374
        self.assertEqual(expected.st_mode, actual.st_mode,
1375
                         'st_mode did not match')
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
1376
4144.1.1 by Robert Collins
New assertLength method based on one Martin has squirreled away somewhere.
1377
    def assertLength(self, length, obj_with_len):
1378
        """Assert that obj_with_len is of length length."""
1379
        if len(obj_with_len) != length:
1380
            self.fail("Incorrect length: wanted %d, got %d for %r" % (
1381
                length, len(obj_with_len), obj_with_len))
1382
4634.85.11 by Andrew Bennetts
Suppress most errors from Branch.unlock too.
1383
    def assertLogsError(self, exception_class, func, *args, **kwargs):
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1384
        """Assert that `func(*args, **kwargs)` quietly logs a specific error.
4634.85.11 by Andrew Bennetts
Suppress most errors from Branch.unlock too.
1385
        """
1386
        captured = []
1387
        orig_log_exception_quietly = trace.log_exception_quietly
1388
        try:
1389
            def capture():
1390
                orig_log_exception_quietly()
5340.15.1 by John Arbash Meinel
supersede exc-info branch
1391
                captured.append(sys.exc_info()[1])
4634.85.11 by Andrew Bennetts
Suppress most errors from Branch.unlock too.
1392
            trace.log_exception_quietly = capture
1393
            func(*args, **kwargs)
1394
        finally:
1395
            trace.log_exception_quietly = orig_log_exception_quietly
1396
        self.assertLength(1, captured)
5340.15.1 by John Arbash Meinel
supersede exc-info branch
1397
        err = captured[0]
4634.85.11 by Andrew Bennetts
Suppress most errors from Branch.unlock too.
1398
        self.assertIsInstance(err, exception_class)
1399
        return err
1400
2474.1.68 by John Arbash Meinel
Review feedback from Martin, mostly documentation updates.
1401
    def assertPositive(self, val):
1402
        """Assert that val is greater than 0."""
1403
        self.assertTrue(val > 0, 'expected a positive value, but got %s' % val)
1404
1405
    def assertNegative(self, val):
1406
        """Assert that val is less than 0."""
1407
        self.assertTrue(val < 0, 'expected a negative value, but got %s' % val)
1408
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
1409
    def assertStartsWith(self, s, prefix):
1410
        if not s.startswith(prefix):
7143.15.2 by Jelmer Vernooij
Run autopep8.
1411
            raise AssertionError(
1412
                'string %r does not start with %r' % (s, prefix))
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
1413
1414
    def assertEndsWith(self, s, suffix):
1692.3.1 by Robert Collins
Fix push to work with just a branch, no need for a working tree.
1415
        """Asserts that s ends with suffix."""
1416
        if not s.endswith(suffix):
7143.15.2 by Jelmer Vernooij
Run autopep8.
1417
            raise AssertionError(
1418
                'string %r does not end with %r' % (s, suffix))
1185.16.42 by Martin Pool
- Add assertContainsRe
1419
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
1420
    def assertContainsRe(self, haystack, needle_re, flags=0):
1185.16.42 by Martin Pool
- Add assertContainsRe
1421
        """Assert that a contains something matching a regular expression."""
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
1422
        if not re.search(needle_re, haystack, flags):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1423
            if (('\n' if isinstance(haystack, str) else b'\n') in haystack or
1424
                    len(haystack) > 60):
2555.3.1 by Martin Pool
Better messages from assertContainsRe
1425
                # a long string, format it in a more readable way
1426
                raise AssertionError(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1427
                    'pattern "%s" not found in\n"""\\\n%s"""\n'
1428
                    % (needle_re, haystack))
2555.3.1 by Martin Pool
Better messages from assertContainsRe
1429
            else:
1430
                raise AssertionError('pattern "%s" not found in "%s"'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1431
                                     % (needle_re, haystack))
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
1432
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
1433
    def assertNotContainsRe(self, haystack, needle_re, flags=0):
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
1434
        """Assert that a does not match a regular expression"""
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
1435
        if re.search(needle_re, haystack, flags):
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
1436
            raise AssertionError('pattern "%s" found in "%s"'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1437
                                 % (needle_re, haystack))
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
1438
5017.2.1 by Martin Pool
Add assertContainsString
1439
    def assertContainsString(self, haystack, needle):
1440
        if haystack.find(needle) == -1:
1441
            self.fail("string %r not found in '''%s'''" % (needle, haystack))
1442
5598.1.1 by Soren Hansen
Fix PEP-8 violation in PythonVersionInfoBuilder's output
1443
    def assertNotContainsString(self, haystack, needle):
1444
        if haystack.find(needle) != -1:
1445
            self.fail("string %r found in '''%s'''" % (needle, haystack))
1446
1553.5.3 by Martin Pool
[patch] Rename TestCase.AssertSubset to assertSubset for consistency (Jan Hudec)
1447
    def assertSubset(self, sublist, superlist):
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
1448
        """Assert that every entry in sublist is present in superlist."""
2695.1.4 by Martin Pool
Much faster assertSubset using sets, not O(n**2)
1449
        missing = set(sublist) - set(superlist)
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
1450
        if len(missing) > 0:
2695.1.4 by Martin Pool
Much faster assertSubset using sets, not O(n**2)
1451
            raise AssertionError("value(s) %r not present in container %r" %
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
1452
                                 (missing, superlist))
1453
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
1454
    def assertListRaises(self, excClass, func, *args, **kwargs):
1455
        """Fail unless excClass is raised when the iterator from func is used.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1456
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
1457
        Many functions can return generators this makes sure
1458
        to wrap them in a list() call to make sure the whole generator
1459
        is run, and that the proper exception is raised.
1460
        """
1461
        try:
1462
            list(func(*args, **kwargs))
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
1463
        except excClass as e:
3287.20.1 by John Arbash Meinel
Update assertListRaises so that it returns the exception.
1464
            return e
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
1465
        else:
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
1466
            if getattr(excClass, '__name__', None) is not None:
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
1467
                excName = excClass.__name__
1468
            else:
1469
                excName = str(excClass)
6619.3.11 by Jelmer Vernooij
Use modern exceptions.
1470
            raise self.failureException("%s not raised" % excName)
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
1471
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
1472
    def assertRaises(self, excClass, callableObj, *args, **kwargs):
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1473
        """Assert that a callable raises a particular exception.
1474
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
1475
        :param excClass: As for the except statement, this may be either an
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1476
            exception class, or a tuple of classes.
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
1477
        :param callableObj: A callable, will be passed ``*args`` and
1478
            ``**kwargs``.
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
1479
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1480
        Returns the exception so that you can examine it.
1481
        """
1482
        try:
2399.1.10 by John Arbash Meinel
fix assertRaises to use the right parameter...
1483
            callableObj(*args, **kwargs)
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
1484
        except excClass as e:
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1485
            return e
1486
        else:
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
1487
            if getattr(excClass, '__name__', None) is not None:
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1488
                excName = excClass.__name__
1489
            else:
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
1490
                # probably a tuple
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1491
                excName = str(excClass)
6619.3.11 by Jelmer Vernooij
Use modern exceptions.
1492
            raise self.failureException("%s not raised" % excName)
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1493
2220.1.13 by Marius Kruger
Remove assertNone
1494
    def assertIs(self, left, right, message=None):
1185.68.1 by Aaron Bentley
test transactions
1495
        if not (left is right):
2220.1.13 by Marius Kruger
Remove assertNone
1496
            if message is not None:
1497
                raise AssertionError(message)
1498
            else:
1499
                raise AssertionError("%r is not %r." % (left, right))
1500
1501
    def assertIsNot(self, left, right, message=None):
1502
        if (left is right):
1503
            if message is not None:
1504
                raise AssertionError(message)
1505
            else:
1506
                raise AssertionError("%r is %r." % (left, right))
2220.1.4 by Marius Kruger
* bzrlib/tests/__init__
1507
1530.1.21 by Robert Collins
Review feedback fixes.
1508
    def assertTransportMode(self, transport, path, mode):
4031.3.1 by Frank Aspell
Fixing various typos
1509
        """Fail if a path does not have mode "mode".
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1510
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
1511
        If modes are not supported on this transport, the assertion is ignored.
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
1512
        """
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
1513
        if not transport._can_roundtrip_unix_modebits():
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
1514
            return
1515
        path_stat = transport.stat(path)
1516
        actual_mode = stat.S_IMODE(path_stat.st_mode)
3508.1.22 by Vincent Ladeuil
Fix python2.4 failures.
1517
        self.assertEqual(mode, actual_mode,
3508.1.15 by Vincent Ladeuil
Tweak chmod bits output for easier debug.
1518
                         'mode of %r incorrect (%s != %s)'
1519
                         % (path, oct(mode), oct(actual_mode)))
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
1520
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
1521
    def assertIsSameRealPath(self, path1, path2):
1522
        """Fail if path1 and path2 points to different files"""
2823.1.11 by Vincent Ladeuil
Review feedback.
1523
        self.assertEqual(osutils.realpath(path1),
1524
                         osutils.realpath(path2),
1525
                         "apparent paths:\na = %s\nb = %s\n," % (path1, path2))
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
1526
4449.3.12 by Martin Pool
assertIsInstance can take an extra message
1527
    def assertIsInstance(self, obj, kls, msg=None):
1528
        """Fail if obj is not an instance of kls
7143.15.2 by Jelmer Vernooij
Run autopep8.
1529
4449.3.12 by Martin Pool
assertIsInstance can take an extra message
1530
        :param msg: Supplementary message to show if the assertion fails.
1531
        """
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1532
        if not isinstance(obj, kls):
4449.3.12 by Martin Pool
assertIsInstance can take an extra message
1533
            m = "%r is an instance of %s rather than %s" % (
1534
                obj, obj.__class__, kls)
1535
            if msg:
1536
                m += ": " + msg
1537
            self.fail(m)
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1538
3173.1.10 by Martin Pool
Move assertFileEqual to TestCase base class as it's generally usable
1539
    def assertFileEqual(self, content, path):
1540
        """Fail if path does not contain 'content'."""
5784.1.2 by Martin Pool
Deprecate, and test, failIfExists and failUnlessExists
1541
        self.assertPathExists(path)
7143.15.2 by Jelmer Vernooij
Run autopep8.
1542
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1543
        mode = 'r' + ('b' if isinstance(content, bytes) else '')
1544
        with open(path, mode) as f:
3173.1.10 by Martin Pool
Move assertFileEqual to TestCase base class as it's generally usable
1545
            s = f.read()
1546
        self.assertEqualDiff(content, s)
1547
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
1548
    def assertDocstring(self, expected_docstring, obj):
1549
        """Fail if obj does not have expected_docstring"""
1550
        if __doc__ is None:
1551
            # With -OO the docstring should be None instead
1552
            self.assertIs(obj.__doc__, None)
1553
        else:
1554
            self.assertEqual(expected_docstring, obj.__doc__)
1555
5784.1.2 by Martin Pool
Deprecate, and test, failIfExists and failUnlessExists
1556
    def assertPathExists(self, path):
3173.1.12 by Martin Pool
Add test_push_log_file
1557
        """Fail unless path or paths, which may be abs or relative, exist."""
6973.5.13 by Jelmer Vernooij
Add notes about cleanups.
1558
        # TODO(jelmer): Clean this up for pad.lv/1696545
6973.5.10 by Jelmer Vernooij
Random bunch of python3 bee-improvements.
1559
        if not isinstance(path, (bytes, str, text_type)):
3173.1.12 by Martin Pool
Add test_push_log_file
1560
            for p in path:
5784.1.2 by Martin Pool
Deprecate, and test, failIfExists and failUnlessExists
1561
                self.assertPathExists(p)
3173.1.12 by Martin Pool
Add test_push_log_file
1562
        else:
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
1563
            self.assertTrue(osutils.lexists(path),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1564
                            path + " does not exist")
3173.1.12 by Martin Pool
Add test_push_log_file
1565
5784.1.2 by Martin Pool
Deprecate, and test, failIfExists and failUnlessExists
1566
    def assertPathDoesNotExist(self, path):
3173.1.12 by Martin Pool
Add test_push_log_file
1567
        """Fail if path or paths, which may be abs or relative, exist."""
6695.3.1 by Martin
Remove remaining uses of basestring from the codebase
1568
        if not isinstance(path, (str, text_type)):
3173.1.12 by Martin Pool
Add test_push_log_file
1569
            for p in path:
5784.1.2 by Martin Pool
Deprecate, and test, failIfExists and failUnlessExists
1570
                self.assertPathDoesNotExist(p)
3173.1.12 by Martin Pool
Add test_push_log_file
1571
        else:
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
1572
            self.assertFalse(osutils.lexists(path),
7143.15.2 by Jelmer Vernooij
Run autopep8.
1573
                             path + " exists")
3173.1.12 by Martin Pool
Add test_push_log_file
1574
2592.3.243 by Martin Pool
Rename TestCase._capture_warnings
1575
    def _capture_deprecation_warnings(self, a_callable, *args, **kwargs):
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1576
        """A helper for callDeprecated and applyDeprecated.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1577
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1578
        :param a_callable: A callable to call.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1579
        :param args: The positional arguments for the callable
1580
        :param kwargs: The keyword arguments for the callable
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1581
        :return: A tuple (warnings, result). result is the result of calling
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1582
            a_callable(``*args``, ``**kwargs``).
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1583
        """
1584
        local_warnings = []
7143.15.2 by Jelmer Vernooij
Run autopep8.
1585
2067.3.3 by Martin Pool
merge bzr.dev and reconcile several changes, also some test fixes
1586
        def capture_warnings(msg, cls=None, stacklevel=None):
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1587
            # we've hooked into a deprecation specific callpath,
1588
            # only deprecations should getting sent via it.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1589
            self.assertEqual(cls, DeprecationWarning)
1590
            local_warnings.append(msg)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1591
        original_warning_method = symbol_versioning.warn
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1592
        symbol_versioning.set_warning_method(capture_warnings)
1593
        try:
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1594
            result = a_callable(*args, **kwargs)
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1595
        finally:
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1596
            symbol_versioning.set_warning_method(original_warning_method)
1597
        return (local_warnings, result)
1598
1599
    def applyDeprecated(self, deprecation_format, a_callable, *args, **kwargs):
1600
        """Call a deprecated callable without warning the user.
1601
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1602
        Note that this only captures warnings raised by symbol_versioning.warn,
1603
        not other callers that go direct to the warning module.
1604
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1605
        To test that a deprecated method raises an error, do something like
5743.13.1 by Vincent Ladeuil
Deprecate _get_editor to identify its usages.
1606
        this (remember that both assertRaises and applyDeprecated delays *args
1607
        and **kwargs passing)::
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1608
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
1609
            self.assertRaises(errors.ReservedId,
1610
                self.applyDeprecated,
1611
                deprecated_in((1, 5, 0)),
1612
                br.append_revision,
1613
                'current:')
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1614
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1615
        :param deprecation_format: The deprecation format that the callable
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1616
            should have been deprecated with. This is the same type as the
1617
            parameter to deprecated_method/deprecated_function. If the
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1618
            callable is not deprecated with this format, an assertion error
1619
            will be raised.
1620
        :param a_callable: A callable to call. This may be a bound method or
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1621
            a regular function. It will be called with ``*args`` and
1622
            ``**kwargs``.
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1623
        :param args: The positional arguments for the callable
1624
        :param kwargs: The keyword arguments for the callable
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1625
        :return: The result of a_callable(``*args``, ``**kwargs``)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1626
        """
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1627
        call_warnings, result = self._capture_deprecation_warnings(
1628
            a_callable, *args, **kwargs)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1629
        expected_first_warning = symbol_versioning.deprecation_string(
1630
            a_callable, deprecation_format)
1631
        if len(call_warnings) == 0:
2255.7.47 by Robert Collins
Improve applyDeprecated warning message.
1632
            self.fail("No deprecation warning generated by call to %s" %
7143.15.2 by Jelmer Vernooij
Run autopep8.
1633
                      a_callable)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1634
        self.assertEqual(expected_first_warning, call_warnings[0])
1635
        return result
1636
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1637
    def callCatchWarnings(self, fn, *args, **kw):
1638
        """Call a callable that raises python warnings.
1639
1640
        The caller's responsible for examining the returned warnings.
1641
1642
        If the callable raises an exception, the exception is not
1643
        caught and propagates up to the caller.  In that case, the list
1644
        of warnings is not available.
1645
1646
        :returns: ([warning_object, ...], fn_result)
1647
        """
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1648
        # XXX: This is not perfect, because it completely overrides the
1649
        # warnings filters, and some code may depend on suppressing particular
1650
        # warnings.  It's the easiest way to insulate ourselves from -Werror,
1651
        # though.  -- Andrew, 20071062
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1652
        wlist = []
7143.15.2 by Jelmer Vernooij
Run autopep8.
1653
3734.5.3 by Vincent Ladeuil
Martin's review feedback.
1654
        def _catcher(message, category, filename, lineno, file=None, line=None):
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1655
            # despite the name, 'message' is normally(?) a Warning subclass
1656
            # instance
1657
            wlist.append(message)
1658
        saved_showwarning = warnings.showwarning
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1659
        saved_filters = warnings.filters
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1660
        try:
1661
            warnings.showwarning = _catcher
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1662
            warnings.filters = []
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1663
            result = fn(*args, **kw)
1664
        finally:
1665
            warnings.showwarning = saved_showwarning
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1666
            warnings.filters = saved_filters
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1667
        return wlist, result
1668
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1669
    def callDeprecated(self, expected, callable, *args, **kwargs):
1670
        """Assert that a callable is deprecated in a particular way.
1671
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1672
        This is a very precise test for unusual requirements. The
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1673
        applyDeprecated helper function is probably more suited for most tests
1674
        as it allows you to simply specify the deprecation format being used
1675
        and will ensure that that is issued for the function being called.
1676
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1677
        Note that this only captures warnings raised by symbol_versioning.warn,
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1678
        not other callers that go direct to the warning module.  To catch
1679
        general warnings, use callCatchWarnings.
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1680
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1681
        :param expected: a list of the deprecation warnings expected, in order
1682
        :param callable: The callable to call
1683
        :param args: The positional arguments for the callable
1684
        :param kwargs: The keyword arguments for the callable
1685
        """
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1686
        call_warnings, result = self._capture_deprecation_warnings(
1687
            callable, *args, **kwargs)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1688
        self.assertEqual(expected, call_warnings)
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1689
        return result
1690
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1691
    def _startLogFile(self):
6220.1.2 by Martin Packman
Update docstrings on TestCase logging functions to reflect current reality
1692
        """Setup a in-memory target for bzr and testcase log messages"""
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
1693
        pseudo_log_file = BytesIO()
7143.15.2 by Jelmer Vernooij
Run autopep8.
1694
5340.15.1 by John Arbash Meinel
supersede exc-info branch
1695
        def _get_log_contents_for_weird_testtools_api():
1696
            return [pseudo_log_file.getvalue().decode(
5923.2.1 by Andrew Bennetts
Rough version of including start_bzr_subprocess's log files in test details.
1697
                "utf-8", "replace").encode("utf-8")]
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1698
        self.addDetail(
1699
            "log", content.Content(
1700
                content.ContentType("text", "plain", {"charset": "utf8"}),
1701
                _get_log_contents_for_weird_testtools_api))
5340.15.1 by John Arbash Meinel
supersede exc-info branch
1702
        self._log_file = pseudo_log_file
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
1703
        self._log_memento = trace.push_log_file(self._log_file)
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1704
        self.addCleanup(self._finishLogFile)
1705
1706
    def _finishLogFile(self):
6220.1.2 by Martin Packman
Update docstrings on TestCase logging functions to reflect current reality
1707
        """Flush and dereference the in-memory log for this testcase"""
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
1708
        if trace._trace_file:
4794.1.9 by Robert Collins
Double \n was deliberate for RandomDecorator.
1709
            # flush the log file, to get all content
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
1710
            trace._trace_file.flush()
1711
        trace.pop_log_file(self._log_memento)
6220.1.1 by Martin Packman
Make triple sure logging cleanup behaves by deleting each _log_memento on TestCase
1712
        # The logging module now tracks references for cleanup so discard ours
1713
        del self._log_memento
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1714
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1715
    def thisFailsStrictLockCheck(self):
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1716
        """It is known that this test would fail with -Dstrict_locks.
1717
1718
        By default, all tests are run with strict lock checking unless
1719
        -Edisable_lock_checks is supplied. However there are some tests which
1720
        we know fail strict locks at this point that have not been fixed.
1721
        They should call this function to disable the strict checking.
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1722
1723
        This should be used sparingly, it is much better to fix the locking
1724
        issues rather than papering over the problem by calling this function.
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1725
        """
1726
        debug.debug_flags.discard('strict_locks')
1727
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
1728
    def overrideAttr(self, obj, attr_name, new=_unitialized_attr):
1729
        """Overrides an object attribute restoring it after the test.
1730
6006.4.10 by Martin Pool
Add caution to overrideAttr docstring
1731
        :note: This should be used with discretion; you should think about
1732
        whether it's better to make the code testable without monkey-patching.
1733
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
1734
        :param obj: The object that will be mutated.
1735
1736
        :param attr_name: The attribute name we want to preserve/override in
1737
            the object.
1738
1739
        :param new: The optional value we want to set the attribute to.
4955.6.1 by Vincent Ladeuil
Implement test.addAttrCleanup.
1740
1741
        :returns: The actual attr value.
1742
        """
1743
        # The actual value is captured by the call below
6015.60.1 by John Arbash Meinel
Teach TestCase.overrideAttr how to handle attributes that don't exist yet.
1744
        value = getattr(obj, attr_name, _unitialized_attr)
1745
        if value is _unitialized_attr:
1746
            # When the test completes, the attribute should not exist, but if
1747
            # we aren't setting a value, we don't need to do anything.
1748
            if new is not _unitialized_attr:
1749
                self.addCleanup(delattr, obj, attr_name)
1750
        else:
1751
            self.addCleanup(setattr, obj, attr_name, value)
4985.1.3 by Vincent Ladeuil
Change it to a more usable form.
1752
        if new is not _unitialized_attr:
1753
            setattr(obj, attr_name, new)
4955.6.1 by Vincent Ladeuil
Implement test.addAttrCleanup.
1754
        return value
1755
5570.3.11 by Vincent Ladeuil
Make overrideEnv returns the value to make it even closer to overrideAttr.
1756
    def overrideEnv(self, name, new):
5574.3.2 by Vincent Ladeuil
Fix typo, the test is thinner when the overrideEnv is cleaned up ;0)
1757
        """Set an environment variable, and reset it after the test.
5570.3.17 by Vincent Ladeuil
Final tweaks and doc.
1758
1759
        :param name: The environment variable name.
1760
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1761
        :param new: The value to set the variable to. If None, the
5570.3.3 by Vincent Ladeuil
Introduce a more robust way to override environment variables (not deployed yet).
1762
            variable is deleted from the environment.
5570.3.11 by Vincent Ladeuil
Make overrideEnv returns the value to make it even closer to overrideAttr.
1763
1764
        :returns: The actual variable value.
5570.3.3 by Vincent Ladeuil
Introduce a more robust way to override environment variables (not deployed yet).
1765
        """
5570.3.11 by Vincent Ladeuil
Make overrideEnv returns the value to make it even closer to overrideAttr.
1766
        value = osutils.set_or_unset_env(name, new)
1767
        self.addCleanup(osutils.set_or_unset_env, name, value)
1768
        return value
5570.3.3 by Vincent Ladeuil
Introduce a more robust way to override environment variables (not deployed yet).
1769
6006.4.1 by Martin Pool
Add recordCalls test helper
1770
    def recordCalls(self, obj, attr_name):
1771
        """Monkeypatch in a wrapper that will record calls.
1772
1773
        The monkeypatch is automatically removed when the test concludes.
1774
1775
        :param obj: The namespace holding the reference to be replaced;
1776
            typically a module, class, or object.
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1777
        :param attr_name: A string for the name of the attribute to patch.
6006.4.1 by Martin Pool
Add recordCalls test helper
1778
        :returns: A list that will be extended with one item every time the
1779
            function is called, with a tuple of (args, kwargs).
1780
        """
1781
        calls = []
1782
1783
        def decorator(*args, **kwargs):
6006.4.2 by Martin Pool
Record calls as a list of tuples, not a flattened list
1784
            calls.append((args, kwargs))
6006.4.1 by Martin Pool
Add recordCalls test helper
1785
            return orig(*args, **kwargs)
1786
        orig = self.overrideAttr(obj, attr_name, decorator)
1787
        return calls
1788
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1789
    def _cleanEnvironment(self):
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
1790
        for name, value in isolated_environ.items():
5570.3.5 by Vincent Ladeuil
_cleanEnvironment can use overrideEnv, this prepare future cleanups.
1791
            self.overrideEnv(name, value)
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1792
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1793
    def _restoreHooks(self):
4119.3.1 by Robert Collins
Create a single registry of all Hooks classes, removing the test suite knowledge of such hooks and allowing plugins to sensibly and safely define new hooks.
1794
        for klass, (name, hooks) in self._preserved_hooks.items():
1795
            setattr(klass, name, hooks)
5340.15.1 by John Arbash Meinel
supersede exc-info branch
1796
        self._preserved_hooks.clear()
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
1797
        breezy.hooks._lazy_hooks = self._preserved_lazy_hooks
5340.15.1 by John Arbash Meinel
supersede exc-info branch
1798
        self._preserved_lazy_hooks.clear()
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1799
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1800
    def knownFailure(self, reason):
6048.1.1 by Martin
Adapt TestCase.knownFailure method to the testtools style so unittest changes don't break it
1801
        """Declare that this test fails for a known reason
1802
1803
        Tests that are known to fail should generally be using expectedFailure
1804
        with an appropriate reverse assertion if a change could cause the test
1805
        to start passing. Conversely if the test has no immediate prospect of
1806
        succeeding then using skip is more suitable.
1807
1808
        When this method is called while an exception is being handled, that
1809
        traceback will be used, otherwise a new exception will be thrown to
6048.1.2 by Martin
Minor wording nits and add release notes
1810
        provide one but won't be reported.
6048.1.1 by Martin
Adapt TestCase.knownFailure method to the testtools style so unittest changes don't break it
1811
        """
1812
        self._add_reason(reason)
1813
        try:
1814
            exc_info = sys.exc_info()
1815
            if exc_info != (None, None, None):
1816
                self._report_traceback(exc_info)
1817
            else:
1818
                try:
1819
                    raise self.failureException(reason)
1820
                except self.failureException:
1821
                    exc_info = sys.exc_info()
1822
            # GZ 02-08-2011: Maybe cleanup this err.exc_info attribute too?
1823
            raise testtools.testcase._ExpectedFailure(exc_info)
1824
        finally:
1825
            del exc_info
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1826
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1827
    def _suppress_log(self):
1828
        """Remove the log info from details."""
1829
        self.discardDetail('log')
1830
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1831
    def _do_skip(self, result, reason):
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1832
        self._suppress_log()
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1833
        addSkip = getattr(result, 'addSkip', None)
1834
        if not callable(addSkip):
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
1835
            result.addSuccess(result)
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1836
        else:
6765.1.2 by Jelmer Vernooij
Fix compatibility.
1837
            addSkip(self, str(reason))
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1838
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1839
    @staticmethod
1840
    def _do_known_failure(self, result, e):
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1841
        self._suppress_log()
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
1842
        err = sys.exc_info()
1843
        addExpectedFailure = getattr(result, 'addExpectedFailure', None)
1844
        if addExpectedFailure is not None:
1845
            addExpectedFailure(self, err)
1846
        else:
1847
            result.addSuccess(self)
1848
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1849
    @staticmethod
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
1850
    def _do_not_applicable(self, result, e):
4780.1.5 by Robert Collins
Fix fallback of NotApplicable to Skip.
1851
        if not e.args:
1852
            reason = 'No reason given'
1853
        else:
1854
            reason = e.args[0]
7143.15.2 by Jelmer Vernooij
Run autopep8.
1855
        self._suppress_log()
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
1856
        addNotApplicable = getattr(result, 'addNotApplicable', None)
1857
        if addNotApplicable is not None:
1858
            result.addNotApplicable(self, reason)
1859
        else:
1860
            self._do_skip(result, reason)
1861
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1862
    @staticmethod
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1863
    def _report_skip(self, result, err):
1864
        """Override the default _report_skip.
1865
1866
        We want to strip the 'log' detail. If we waint until _do_skip, it has
1867
        already been formatted into the 'reason' string, and we can't pull it
1868
        out again.
1869
        """
1870
        self._suppress_log()
1871
        super(TestCase, self)._report_skip(self, result, err)
1872
1873
    @staticmethod
1874
    def _report_expected_failure(self, result, err):
1875
        """Strip the log.
1876
1877
        See _report_skip for motivation.
1878
        """
1879
        self._suppress_log()
1880
        super(TestCase, self)._report_expected_failure(self, result, err)
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1881
1882
    @staticmethod
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1883
    def _do_unsupported_or_skip(self, result, e):
1884
        reason = e.args[0]
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1885
        self._suppress_log()
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
1886
        addNotSupported = getattr(result, 'addNotSupported', None)
1887
        if addNotSupported is not None:
1888
            result.addNotSupported(self, reason)
1889
        else:
1890
            self._do_skip(result, reason)
1891
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
1892
    def time(self, callable, *args, **kwargs):
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1893
        """Run callable and accrue the time it takes to the benchmark time.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1894
6622.1.30 by Jelmer Vernooij
Some more test fixes.
1895
        If lsprofiling is enabled (i.e. by --lsprof-time to brz selftest) then
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1896
        this will cause lsprofile statistics to be gathered and stored in
1897
        self._benchcalls.
1898
        """
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
1899
        if self._benchtime is None:
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1900
            self.addDetail('benchtime', content.Content(
1901
                content.UTF8_TEXT,
1902
                lambda: [str(self._benchtime).encode('utf-8')]))
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
1903
            self._benchtime = 0
1904
        start = time.time()
1905
        try:
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1906
            if not self._gather_lsprof_in_benchmarks:
1907
                return callable(*args, **kwargs)
1908
            else:
1909
                # record this benchmark
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
1910
                ret, stats = breezy.lsprof.profile(callable, *args, **kwargs)
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1911
                stats.sort()
1912
                self._benchcalls.append(((callable, args, kwargs), stats))
1913
                return ret
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
1914
        finally:
1915
            self._benchtime += time.time() - start
1916
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1917
    def log(self, *args):
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
1918
        trace.mutter(*args)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1919
4794.1.15 by Robert Collins
Review feedback.
1920
    def get_log(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
1921
        """Get a unicode string containing the log from breezy.trace.
4794.1.15 by Robert Collins
Review feedback.
1922
1923
        Undecodable characters are replaced.
1924
        """
1925
        return u"".join(self.getDetails()['log'].iter_text())
1926
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1927
    def requireFeature(self, feature):
1928
        """This test requires a specific feature is available.
1929
1930
        :raises UnavailableFeature: When feature is not available.
1931
        """
1932
        if not feature.available():
1933
            raise UnavailableFeature(feature)
1934
7065.3.1 by Jelmer Vernooij
Some refactoring.
1935
    def _run_bzr_core(self, args, encoding, stdin, stdout, stderr,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1936
                      working_dir):
7065.3.1 by Jelmer Vernooij
Some refactoring.
1937
        # Clear chk_map page cache, because the contents are likely to mask
1938
        # locking errors.
1939
        chk_map.clear_cache()
1940
1941
        self.log('run brz: %r', args)
1942
7065.3.3 by Jelmer Vernooij
Add a run_bzr_raw function and use it.
1943
        if PY3:
1944
            self._last_cmd_stdout = stdout
1945
            self._last_cmd_stderr = stderr
1946
        else:
1947
            self._last_cmd_stdout = codecs.getwriter(encoding)(stdout)
1948
            self._last_cmd_stderr = codecs.getwriter(encoding)(stderr)
6621.22.1 by Martin
Refactor bzrlib.ui to be based on unicode streams
1949
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
1950
        old_ui_factory = ui.ui_factory
6621.22.1 by Martin
Refactor bzrlib.ui to be based on unicode streams
1951
        ui.ui_factory = ui_testing.TestUIFactory(
1952
            stdin=stdin,
1953
            stdout=self._last_cmd_stdout,
1954
            stderr=self._last_cmd_stderr)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1955
1956
        cwd = None
1957
        if working_dir is not None:
1958
            cwd = osutils.getcwd()
1959
            os.chdir(working_dir)
1960
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1961
        try:
6910.3.1 by Martin
Delay stream wrapping and fix choose in char based mode
1962
            with ui.ui_factory:
1963
                result = self.apply_redirected(
1964
                    ui.ui_factory.stdin,
1965
                    stdout, stderr,
1966
                    _mod_commands.run_bzr_catch_user_errors,
1967
                    args)
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1968
        finally:
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
1969
            ui.ui_factory = old_ui_factory
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1970
            if cwd is not None:
1971
                os.chdir(cwd)
1685.1.69 by Wouter van Heyst
merge bzr.dev 1740
1972
7065.3.1 by Jelmer Vernooij
Some refactoring.
1973
        return result
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1974
7065.3.3 by Jelmer Vernooij
Add a run_bzr_raw function and use it.
1975
    def run_bzr_raw(self, args, retcode=0, stdin=None, encoding=None,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1976
                    working_dir=None, error_regexes=[]):
7065.3.3 by Jelmer Vernooij
Add a run_bzr_raw function and use it.
1977
        """Invoke brz, as if it were run from the command line.
1978
1979
        The argument list should not include the brz program name - the
1980
        first argument is normally the brz command.  Arguments may be
1981
        passed in three ways:
1982
1983
        1- A list of strings, eg ["commit", "a"].  This is recommended
1984
        when the command contains whitespace or metacharacters, or
1985
        is built up at run time.
1986
1987
        2- A single string, eg "add a".  This is the most convenient
1988
        for hardcoded commands.
1989
1990
        This runs brz through the interface that catches and reports
1991
        errors, and with logging set to something approximating the
1992
        default, so that error reporting can be checked.
1993
1994
        This should be the main method for tests that want to exercise the
1995
        overall behavior of the brz application (rather than a unit test
1996
        or a functional test of the library.)
1997
1998
        This sends the stdout/stderr results into the test's log,
1999
        where it may be useful for debugging.  See also run_captured.
2000
2001
        :keyword stdin: A string to be used as stdin for the command.
2002
        :keyword retcode: The status code the command should return;
2003
            default 0.
2004
        :keyword working_dir: The directory to run the command in
2005
        :keyword error_regexes: A list of expected error messages.  If
2006
            specified they must be seen in the error output of the command.
2007
        """
2008
        if isinstance(args, string_types):
2009
            args = shlex.split(args)
2010
2011
        if encoding is None:
2012
            encoding = osutils.get_user_encoding()
2013
2014
        if sys.version_info[0] == 2:
2015
            wrapped_stdout = stdout = ui_testing.BytesIOWithEncoding()
2016
            wrapped_stderr = stderr = ui_testing.BytesIOWithEncoding()
2017
            stdout.encoding = stderr.encoding = encoding
7065.3.6 by Jelmer Vernooij
Fix some more tests.
2018
2019
            # FIXME: don't call into logging here
2020
            handler = trace.EncodedStreamHandler(
2021
                stderr, errors="replace")
7065.3.3 by Jelmer Vernooij
Add a run_bzr_raw function and use it.
2022
        else:
2023
            stdout = BytesIO()
2024
            stderr = BytesIO()
2025
            wrapped_stdout = TextIOWrapper(stdout, encoding)
2026
            wrapped_stderr = TextIOWrapper(stderr, encoding)
7065.3.6 by Jelmer Vernooij
Fix some more tests.
2027
            handler = logging.StreamHandler(wrapped_stderr)
2028
        handler.setLevel(logging.INFO)
2029
2030
        logger = logging.getLogger('')
2031
        logger.addHandler(handler)
2032
        try:
2033
            result = self._run_bzr_core(
7143.15.2 by Jelmer Vernooij
Run autopep8.
2034
                args, encoding=encoding, stdin=stdin, stdout=wrapped_stdout,
2035
                stderr=wrapped_stderr, working_dir=working_dir,
2036
                )
7065.3.6 by Jelmer Vernooij
Fix some more tests.
2037
        finally:
2038
            logger.removeHandler(handler)
2039
2040
        if PY3:
2041
            wrapped_stdout.flush()
2042
            wrapped_stderr.flush()
7065.3.3 by Jelmer Vernooij
Add a run_bzr_raw function and use it.
2043
2044
        out = stdout.getvalue()
2045
        err = stderr.getvalue()
2046
        if out:
2047
            self.log('output:\n%r', out)
2048
        if err:
2049
            self.log('errors:\n%r', err)
2050
        if retcode is not None:
2051
            self.assertEqual(retcode, result,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2052
                             message='Unexpected return code')
7065.3.3 by Jelmer Vernooij
Add a run_bzr_raw function and use it.
2053
        self.assertIsInstance(error_regexes, (list, tuple))
2054
        for regex in error_regexes:
2055
            self.assertContainsRe(err, regex)
2056
        return out, err
2057
6621.22.1 by Martin
Refactor bzrlib.ui to be based on unicode streams
2058
    def run_bzr(self, args, retcode=0, stdin=None, encoding=None,
2059
                working_dir=None, error_regexes=[]):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2060
        """Invoke brz, as if it were run from the command line.
1119 by Martin Pool
doc
2061
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2062
        The argument list should not include the brz program name - the
2063
        first argument is normally the brz command.  Arguments may be
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
2064
        passed in three ways:
2065
2066
        1- A list of strings, eg ["commit", "a"].  This is recommended
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2067
        when the command contains whitespace or metacharacters, or
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
2068
        is built up at run time.
2069
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2070
        2- A single string, eg "add a".  This is the most convenient
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
2071
        for hardcoded commands.
2072
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2073
        This runs brz through the interface that catches and reports
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
2074
        errors, and with logging set to something approximating the
2075
        default, so that error reporting can be checked.
2076
1119 by Martin Pool
doc
2077
        This should be the main method for tests that want to exercise the
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2078
        overall behavior of the brz application (rather than a unit test
1119 by Martin Pool
doc
2079
        or a functional test of the library.)
2080
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
2081
        This sends the stdout/stderr results into the test's log,
2082
        where it may be useful for debugging.  See also run_captured.
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
2083
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2084
        :keyword stdin: A string to be used as stdin for the command.
2399.1.17 by John Arbash Meinel
[merge] bzr.dev 2562
2085
        :keyword retcode: The status code the command should return;
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
2086
            default 0.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2087
        :keyword working_dir: The directory to run the command in
2399.1.17 by John Arbash Meinel
[merge] bzr.dev 2562
2088
        :keyword error_regexes: A list of expected error messages.  If
2089
            specified they must be seen in the error output of the command.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2090
        """
7065.3.2 by Jelmer Vernooij
Some more refactoring.
2091
        if isinstance(args, string_types):
2092
            args = shlex.split(args)
2093
2094
        if encoding is None:
2095
            encoding = osutils.get_user_encoding()
2096
2097
        if sys.version_info[0] == 2:
2098
            stdout = ui_testing.BytesIOWithEncoding()
2099
            stderr = ui_testing.BytesIOWithEncoding()
2100
            stdout.encoding = stderr.encoding = encoding
7065.3.6 by Jelmer Vernooij
Fix some more tests.
2101
            # FIXME: don't call into logging here
2102
            handler = trace.EncodedStreamHandler(
2103
                stderr, errors="replace")
7065.3.2 by Jelmer Vernooij
Some more refactoring.
2104
        else:
2105
            stdout = ui_testing.StringIOWithEncoding()
2106
            stderr = ui_testing.StringIOWithEncoding()
2107
            stdout.encoding = stderr.encoding = encoding
7065.3.6 by Jelmer Vernooij
Fix some more tests.
2108
            handler = logging.StreamHandler(stream=stderr)
2109
        handler.setLevel(logging.INFO)
2110
2111
        logger = logging.getLogger('')
2112
        logger.addHandler(handler)
2113
2114
        try:
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2115
            result = self._run_bzr_core(
2116
                args, encoding=encoding, stdin=stdin, stdout=stdout,
2117
                stderr=stderr, working_dir=working_dir)
7065.3.6 by Jelmer Vernooij
Fix some more tests.
2118
        finally:
2119
            logger.removeHandler(handler)
7065.3.2 by Jelmer Vernooij
Some more refactoring.
2120
2121
        out = stdout.getvalue()
2122
        err = stderr.getvalue()
2123
        if out:
2124
            self.log('output:\n%r', out)
2125
        if err:
2126
            self.log('errors:\n%r', err)
2127
        if retcode is not None:
2128
            self.assertEqual(retcode, result,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2129
                             message='Unexpected return code')
4325.4.6 by Vincent Ladeuil
Fixed as per John's and Markus reviews.
2130
        self.assertIsInstance(error_regexes, (list, tuple))
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
2131
        for regex in error_regexes:
2132
            self.assertContainsRe(err, regex)
2133
        return out, err
2134
1711.2.70 by John Arbash Meinel
Add run_bzr_errors alongside run_bzr, to make it easy to check the right error is occurring.
2135
    def run_bzr_error(self, error_regexes, *args, **kwargs):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2136
        """Run brz, and check that stderr contains the supplied regexes
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2137
2138
        :param error_regexes: Sequence of regular expressions which
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
2139
            must each be found in the error output. The relative ordering
2140
            is not enforced.
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2141
        :param args: command-line arguments for brz
2142
        :param kwargs: Keyword arguments which are interpreted by run_brz
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
2143
            This function changes the default value of retcode to be 3,
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2144
            since in most cases this is run when you expect brz to fail.
2581.1.1 by Martin Pool
Merge more runbzr cleanups
2145
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2146
        :return: (out, err) The actual output of running the command (in case
2147
            you want to do more inspection)
2148
2149
        Examples of use::
2150
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
2151
            # Make sure that commit is failing because there is nothing to do
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
2152
            self.run_bzr_error(['no changes to commit'],
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
2153
                               ['commit', '-m', 'my commit comment'])
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
2154
            # Make sure --strict is handling an unknown file, rather than
2155
            # giving us the 'nothing to do' error
2156
            self.build_tree(['unknown'])
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2157
            self.run_bzr_error(
2158
                ['Commit refused because there are unknown files'],
2159
                ['commit', --strict', '-m', 'my commit comment'])
1711.2.71 by John Arbash Meinel
Default to retcode=3, and add a test for run_bzr_error
2160
        """
2161
        kwargs.setdefault('retcode', 3)
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
2162
        kwargs['error_regexes'] = error_regexes
2163
        out, err = self.run_bzr(*args, **kwargs)
1711.2.71 by John Arbash Meinel
Default to retcode=3, and add a test for run_bzr_error
2164
        return out, err
1711.2.70 by John Arbash Meinel
Add run_bzr_errors alongside run_bzr, to make it easy to check the right error is occurring.
2165
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
2166
    def run_bzr_subprocess(self, *args, **kwargs):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2167
        """Run brz in a subprocess for testing.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
2168
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2169
        This starts a new Python interpreter and runs brz in there.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
2170
        This should only be used for tests that have a justifiable need for
2171
        this isolation: e.g. they are testing startup time, or signal
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2172
        handling, or early startup code, etc.  Subprocess code can't be
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
2173
        profiled or debugged so easily.
1752.1.7 by Aaron Bentley
Stop using shlex in run_bzr_subprocess
2174
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2175
        :keyword retcode: The status code that is expected.  Defaults to 0.  If
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
2176
            None is supplied, the status code is not checked.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2177
        :keyword env_changes: A dictionary which lists changes to environment
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
2178
            variables. A value of None will unset the env variable.
2179
            The values must be strings. The change will only occur in the
2180
            child, so you don't need to fix the environment after running.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2181
        :keyword universal_newlines: Convert CRLF => LF
2182
        :keyword allow_plugins: By default the subprocess is run with
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2183
            --no-plugins to ensure test reproducibility. Also, it is possible
2067.2.2 by John Arbash Meinel
Review comments from Robert
2184
            for system-wide plugins to create unexpected output on stderr,
2185
            which can cause unnecessary test failures.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
2186
        """
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
2187
        env_changes = kwargs.get('env_changes', {})
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
2188
        working_dir = kwargs.get('working_dir', None)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2189
        allow_plugins = kwargs.get('allow_plugins', False)
2665.4.1 by Aaron Bentley
teach run_bzr_subprocess to accept either a list of strings or a string
2190
        if len(args) == 1:
2191
            if isinstance(args[0], list):
2192
                args = args[0]
6695.3.1 by Martin
Remove remaining uses of basestring from the codebase
2193
            elif isinstance(args[0], (str, text_type)):
2665.4.1 by Aaron Bentley
teach run_bzr_subprocess to accept either a list of strings or a string
2194
                args = list(shlex.split(args[0]))
2195
        else:
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
2196
            raise ValueError("passing varargs to run_bzr_subprocess")
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
2197
        process = self.start_bzr_subprocess(args, env_changes=env_changes,
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2198
                                            working_dir=working_dir,
2199
                                            allow_plugins=allow_plugins)
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2200
        # We distinguish between retcode=None and retcode not passed.
2201
        supplied_retcode = kwargs.get('retcode', 0)
2202
        return self.finish_bzr_subprocess(process, retcode=supplied_retcode,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2203
                                          universal_newlines=kwargs.get(
2204
                                              'universal_newlines', False),
2205
                                          process_args=args)
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2206
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
2207
    def start_bzr_subprocess(self, process_args, env_changes=None,
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
2208
                             skip_if_plan_to_signal=False,
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2209
                             working_dir=None,
5898.2.1 by Andrew Bennetts
Fix deadlock in TestImportTariffs.test_simple_serve.
2210
                             allow_plugins=False, stderr=subprocess.PIPE):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2211
        """Start brz in a subprocess for testing.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2212
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2213
        This starts a new Python interpreter and runs brz in there.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2214
        This should only be used for tests that have a justifiable need for
2215
        this isolation: e.g. they are testing startup time, or signal
2216
        handling, or early startup code, etc.  Subprocess code can't be
2217
        profiled or debugged so easily.
2218
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2219
        :param process_args: a list of arguments to pass to the brz executable,
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
2220
            for example ``['--version']``.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2221
        :param env_changes: A dictionary which lists changes to environment
2222
            variables. A value of None will unset the env variable.
2223
            The values must be strings. The change will only occur in the
2224
            child, so you don't need to fix the environment after running.
5340.10.1 by Martin
Correct check on whether signalling subprocess is supported
2225
        :param skip_if_plan_to_signal: raise TestSkipped when true and system
2226
            doesn't support signalling subprocesses.
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2227
        :param allow_plugins: If False (default) pass --no-plugins to brz.
5898.2.2 by Andrew Bennetts
Document new 'stderr' param of start_bzr_subprocess.
2228
        :param stderr: file to use for the subprocess's stderr.  Valid values
2229
            are those valid for the stderr argument of `subprocess.Popen`.
2230
            Default value is ``subprocess.PIPE``.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2231
2232
        :returns: Popen object for the started process.
2233
        """
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
2234
        if skip_if_plan_to_signal:
5340.10.1 by Martin
Correct check on whether signalling subprocess is supported
2235
            if os.name != "posix":
2236
                raise TestSkipped("Sending signals not supported")
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
2237
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2238
        if env_changes is None:
2239
            env_changes = {}
6331.4.1 by Martin Packman
Set before starting a test subprocess to compute the same sys.path
2240
        # Because $HOME is set to a tempdir for the context of a test, modules
2241
        # installed in the user dir will not be found unless $PYTHONUSERBASE
2242
        # gets set to the computed directory of this parent process.
2243
        if site.USER_BASE is not None:
2244
            env_changes["PYTHONUSERBASE"] = site.USER_BASE
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
2245
        old_env = {}
2246
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
2247
        def cleanup_environment():
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
2248
            for env_var, value in env_changes.items():
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
2249
                old_env[env_var] = osutils.set_or_unset_env(env_var, value)
2250
2251
        def restore_environment():
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
2252
            for env_var, value in old_env.items():
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
2253
                osutils.set_or_unset_env(env_var, value)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
2254
6622.1.1 by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz.
2255
        bzr_path = self.get_brz_path()
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
2256
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
2257
        cwd = None
2258
        if working_dir is not None:
2259
            cwd = osutils.getcwd()
2260
            os.chdir(working_dir)
2261
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
2262
        try:
2263
            # win32 subprocess doesn't support preexec_fn
2264
            # so we will avoid using it on all platforms, just to
2265
            # make sure the code path is used, and we don't break on win32
2266
            cleanup_environment()
5923.2.3 by Andrew Bennetts
Make a nice helper method rather than using a closure, cope better with multiple subprocesses, and add a release-notes entry.
2267
            # Include the subprocess's log file in the test details, in case
2268
            # the test fails due to an error in the subprocess.
6622.1.33 by Jelmer Vernooij
Fix more tests (all?)
2269
            self._add_subprocess_log(trace._get_brz_log_filename())
3616.2.1 by Mark Hammond
Fix how blackbox tests start bzr from frozen executables.
2270
            command = [sys.executable]
2271
            # frozen executables don't need the path to bzr
3616.2.7 by Mark Hammond
prefer getattr() over hasattr()
2272
            if getattr(sys, "frozen", None) is None:
3616.2.1 by Mark Hammond
Fix how blackbox tests start bzr from frozen executables.
2273
                command.append(bzr_path)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2274
            if not allow_plugins:
2275
                command.append('--no-plugins')
2276
            command.extend(process_args)
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2277
            process = self._popen(command, stdin=subprocess.PIPE,
2278
                                  stdout=subprocess.PIPE,
6973.12.9 by Jelmer Vernooij
More fixes.
2279
                                  stderr=stderr, bufsize=0)
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
2280
        finally:
2281
            restore_environment()
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
2282
            if cwd is not None:
2283
                os.chdir(cwd)
2284
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2285
        return process
2286
5923.2.3 by Andrew Bennetts
Make a nice helper method rather than using a closure, cope better with multiple subprocesses, and add a release-notes entry.
2287
    def _add_subprocess_log(self, log_file_path):
2288
        if len(self._log_files) == 0:
2289
            # Register an addCleanup func.  We do this on the first call to
2290
            # _add_subprocess_log rather than in TestCase.setUp so that this
2291
            # addCleanup is registered after any cleanups for tempdirs that
2292
            # subclasses might create, which will probably remove the log file
2293
            # we want to read.
2294
            self.addCleanup(self._subprocess_log_cleanup)
2295
        # self._log_files is a set, so if a log file is reused we won't grab it
2296
        # twice.
2297
        self._log_files.add(log_file_path)
2298
2299
    def _subprocess_log_cleanup(self):
2300
        for count, log_file_path in enumerate(self._log_files):
2301
            # We use buffer_now=True to avoid holding the file open beyond
2302
            # the life of this function, which might interfere with e.g.
2303
            # cleaning tempdirs on Windows.
5923.2.5 by Andrew Bennetts
testtools 0.9.5 doesn't have content_from_file, so do it by hand.
2304
            # XXX: Testtools 0.9.5 doesn't have the content_from_file helper
7143.15.2 by Jelmer Vernooij
Run autopep8.
2305
            # detail_content = content.content_from_file(
5923.2.5 by Andrew Bennetts
testtools 0.9.5 doesn't have content_from_file, so do it by hand.
2306
            #    log_file_path, buffer_now=True)
2307
            with open(log_file_path, 'rb') as log_file:
2308
                log_file_bytes = log_file.read()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2309
            detail_content = content.Content(
2310
                content.ContentType("text", "plain", {"charset": "utf8"}),
2311
                lambda: [log_file_bytes])
5923.2.3 by Andrew Bennetts
Make a nice helper method rather than using a closure, cope better with multiple subprocesses, and add a release-notes entry.
2312
            self.addDetail("start_bzr_subprocess-log-%d" % (count,),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2313
                           detail_content)
5923.2.3 by Andrew Bennetts
Make a nice helper method rather than using a closure, cope better with multiple subprocesses, and add a release-notes entry.
2314
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2315
    def _popen(self, *args, **kwargs):
2316
        """Place a call to Popen.
2067.2.2 by John Arbash Meinel
Review comments from Robert
2317
2318
        Allows tests to override this method to intercept the calls made to
2319
        Popen for introspection.
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2320
        """
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2321
        return subprocess.Popen(*args, **kwargs)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2322
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2323
    def get_source_path(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
2324
        """Return the path of the directory containing breezy."""
2325
        return os.path.dirname(os.path.dirname(breezy.__file__))
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2326
6622.1.1 by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz.
2327
    def get_brz_path(self):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2328
        """Return the path of the 'brz' executable for this test suite."""
6622.1.1 by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz.
2329
        brz_path = os.path.join(self.get_source_path(), "brz")
2330
        if not os.path.isfile(brz_path):
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
2331
            # We are probably installed. Assume sys.argv is the right file
6622.1.1 by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz.
2332
            brz_path = sys.argv[0]
2333
        return brz_path
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
2334
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2335
    def finish_bzr_subprocess(self, process, retcode=0, send_signal=None,
2336
                              universal_newlines=False, process_args=None):
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2337
        """Finish the execution of process.
2338
2339
        :param process: the Popen object returned from start_bzr_subprocess.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2340
        :param retcode: The status code that is expected.  Defaults to 0.  If
2341
            None is supplied, the status code is not checked.
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2342
        :param send_signal: an optional signal to send to the process.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2343
        :param universal_newlines: Convert CRLF => LF
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2344
        :returns: (stdout, stderr)
2345
        """
2346
        if send_signal is not None:
2347
            os.kill(process.pid, send_signal)
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2348
        out, err = process.communicate()
2349
2350
        if universal_newlines:
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
2351
            out = out.replace(b'\r\n', b'\n')
2352
            err = err.replace(b'\r\n', b'\n')
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2353
2354
        if retcode is not None and retcode != process.returncode:
2355
            if process_args is None:
2356
                process_args = "(unknown args)"
6690.4.1 by Martin
Fix test trace so test_utf8_default_fs_enc fails cleaner
2357
            trace.mutter('Output of brz %r:\n%s', process_args, out)
2358
            trace.mutter('Error for brz %r:\n%s', process_args, err)
2359
            self.fail('Command brz %r failed with retcode %d != %d'
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2360
                      % (process_args, retcode, process.returncode))
2361
        return [out, err]
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2362
5807.1.5 by Jelmer Vernooij
Fix more things to use tree objects.
2363
    def check_tree_shape(self, tree, shape):
2364
        """Compare a tree to a list of expected names.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2365
2366
        Fail if they are not precisely equal.
2367
        """
2368
        extras = []
2369
        shape = list(shape)             # copy
5807.1.5 by Jelmer Vernooij
Fix more things to use tree objects.
2370
        for path, ie in tree.iter_entries_by_dir():
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2371
            name = path.replace('\\', '/')
2545.3.1 by James Westby
Fix detection of directory entries in the inventory.
2372
            if ie.kind == 'directory':
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2373
                name = name + '/'
5807.1.8 by Jelmer Vernooij
Fix some tests.
2374
            if name == "/":
7143.15.2 by Jelmer Vernooij
Run autopep8.
2375
                pass  # ignore root entry
5807.1.8 by Jelmer Vernooij
Fix some tests.
2376
            elif name in shape:
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2377
                shape.remove(name)
2378
            else:
2379
                extras.append(name)
2380
        if shape:
2381
            self.fail("expected paths not found in inventory: %r" % shape)
2382
        if extras:
2383
            self.fail("unexpected paths found in inventory: %r" % extras)
2384
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2385
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
2386
                         a_callable=None, *args, **kwargs):
2387
        """Call callable with redirected std io pipes.
2388
2389
        Returns the return code."""
2390
        if not callable(a_callable):
2391
            raise ValueError("a_callable must be callable.")
2392
        if stdin is None:
6695.1.1 by Martin
Make ui package pass tests on Python 3
2393
            stdin = BytesIO(b"")
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2394
        if stdout is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
2395
            if getattr(self, "_log_file", None) is not None:
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
2396
                stdout = self._log_file
2397
            else:
6973.13.2 by Jelmer Vernooij
Fix some more tests.
2398
                if sys.version_info[0] == 2:
2399
                    stdout = BytesIO()
2400
                else:
2401
                    stdout = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2402
        if stderr is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
2403
            if getattr(self, "_log_file", None is not None):
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
2404
                stderr = self._log_file
2405
            else:
6973.13.2 by Jelmer Vernooij
Fix some more tests.
2406
                if sys.version_info[0] == 2:
2407
                    stderr = BytesIO()
2408
                else:
2409
                    stderr = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2410
        real_stdin = sys.stdin
2411
        real_stdout = sys.stdout
2412
        real_stderr = sys.stderr
2413
        try:
2414
            sys.stdout = stdout
2415
            sys.stderr = stderr
2416
            sys.stdin = stdin
1160 by Martin Pool
- tiny refactoring
2417
            return a_callable(*args, **kwargs)
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2418
        finally:
2419
            sys.stdout = real_stdout
2420
            sys.stderr = real_stderr
2421
            sys.stdin = real_stdin
2422
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2423
    def reduceLockdirTimeout(self):
2424
        """Reduce the default lock timeout for the duration of the test, so that
2425
        if LockContention occurs during a test, it does so quickly.
2426
2427
        Tests that expect to provoke LockContention errors should call this.
2428
        """
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
2429
        self.overrideAttr(lockdir, '_DEFAULT_TIMEOUT_SECONDS', 0)
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2430
2717.1.1 by Lukáš Lalinsky
Use UTF-8 encoded StringIO for log tests to avoid failures on non-ASCII committer names.
2431
    def make_utf8_encoded_stringio(self, encoding_type=None):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
2432
        """Return a wrapped BytesIO, that will encode text input to UTF-8."""
2717.1.1 by Lukáš Lalinsky
Use UTF-8 encoded StringIO for log tests to avoid failures on non-ASCII committer names.
2433
        if encoding_type is None:
2434
            encoding_type = 'strict'
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
2435
        bio = BytesIO()
2717.1.1 by Lukáš Lalinsky
Use UTF-8 encoded StringIO for log tests to avoid failures on non-ASCII committer names.
2436
        output_encoding = 'utf-8'
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
2437
        sio = codecs.getwriter(output_encoding)(bio, errors=encoding_type)
2717.1.1 by Lukáš Lalinsky
Use UTF-8 encoded StringIO for log tests to avoid failures on non-ASCII committer names.
2438
        sio.encoding = output_encoding
2439
        return sio
2440
4476.3.32 by Andrew Bennetts
Move disable_verb into base TestCase to remove duplication, fix trivial test failures due to new insert_stream verb in test_remote (and also add some trivial tests for the new verb).
2441
    def disable_verb(self, verb):
2442
        """Disable a smart server verb for one test."""
6670.4.16 by Jelmer Vernooij
Move smart to breezy.bzr.
2443
        from breezy.bzr.smart import request
4476.3.32 by Andrew Bennetts
Move disable_verb into base TestCase to remove duplication, fix trivial test failures due to new insert_stream verb in test_remote (and also add some trivial tests for the new verb).
2444
        request_handlers = request.request_handlers
2445
        orig_method = request_handlers.get(verb)
6206.1.11 by Jelmer Vernooij
Preserve info when restoring verbs after disabling/overriding.
2446
        orig_info = request_handlers.get_info(verb)
4476.3.32 by Andrew Bennetts
Move disable_verb into base TestCase to remove duplication, fix trivial test failures due to new insert_stream verb in test_remote (and also add some trivial tests for the new verb).
2447
        request_handlers.remove(verb)
6206.1.11 by Jelmer Vernooij
Preserve info when restoring verbs after disabling/overriding.
2448
        self.addCleanup(request_handlers.register, verb, orig_method,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2449
                        info=orig_info)
4476.3.32 by Andrew Bennetts
Move disable_verb into base TestCase to remove duplication, fix trivial test failures due to new insert_stream verb in test_remote (and also add some trivial tests for the new verb).
2450
6621.2.26 by Martin
Misc set of changes to get started with selftest on Python 3
2451
    def __hash__(self):
2452
        return id(self)
2453
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2454
4070.3.1 by Robert Collins
Alter branch sprouting with an alternate fix for stacked branches that does not require multiple copy_content_into and set_parent calls, reducing IO and round trips.
2455
class CapturedCall(object):
2456
    """A helper for capturing smart server calls for easy debug analysis."""
2457
2458
    def __init__(self, params, prefix_length):
2459
        """Capture the call with params and skip prefix_length stack frames."""
2460
        self.call = params
2461
        import traceback
2462
        # The last 5 frames are the __init__, the hook frame, and 3 smart
2463
        # client frames. Beyond this we could get more clever, but this is good
2464
        # enough for now.
2465
        stack = traceback.extract_stack()[prefix_length:-5]
2466
        self.stack = ''.join(traceback.format_list(stack))
2467
2468
    def __str__(self):
2469
        return self.call.method
2470
2471
    def __repr__(self):
2472
        return self.call.method
2473
2474
    def stack(self):
2475
        return self.stack
2476
2477
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2478
class TestCaseWithMemoryTransport(TestCase):
2479
    """Common test class for tests that do not need disk resources.
2480
5984.1.4 by Vincent Ladeuil
Make the test framework more robust against BZR_LOG leaks.
2481
    Tests that need disk resources should derive from TestCaseInTempDir
2482
    orTestCaseWithTransport.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2483
6622.1.30 by Jelmer Vernooij
Some more test fixes.
2484
    TestCaseWithMemoryTransport sets the TEST_ROOT variable for all brz tests.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2485
5984.1.4 by Vincent Ladeuil
Make the test framework more robust against BZR_LOG leaks.
2486
    For TestCaseWithMemoryTransport the ``test_home_dir`` is set to the name of
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2487
    a directory which does not exist. This serves to help ensure test isolation
5984.1.4 by Vincent Ladeuil
Make the test framework more robust against BZR_LOG leaks.
2488
    is preserved. ``test_dir`` is set to the TEST_ROOT, as is cwd, because they
2489
    must exist. However, TestCaseWithMemoryTransport does not offer local file
2490
    defaults for the transport in tests, nor does it obey the command line
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2491
    override, so tests that accidentally write to the common directory should
2492
    be rare.
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
2493
5984.1.4 by Vincent Ladeuil
Make the test framework more robust against BZR_LOG leaks.
2494
    :cvar TEST_ROOT: Directory containing all temporary directories, plus a
2495
        ``.bzr`` directory that stops us ascending higher into the filesystem.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2496
    """
2497
2498
    TEST_ROOT = None
2499
    _TEST_NAME = 'test'
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2500
1986.2.5 by Robert Collins
Unbreak transport tests.
2501
    def __init__(self, methodName='runTest'):
3128.1.3 by Vincent Ladeuil
Since we are there s/parameteris.*/parameteriz&/.
2502
        # allow test parameterization after test construction and before test
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2503
        # execution. Variables that the parameterizer sets need to be
1986.2.5 by Robert Collins
Unbreak transport tests.
2504
        # ones that are not set by setUp, or setUp will trash them.
2505
        super(TestCaseWithMemoryTransport, self).__init__(methodName)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2506
        self.vfs_transport_factory = default_transport
2507
        self.transport_server = None
1986.2.5 by Robert Collins
Unbreak transport tests.
2508
        self.transport_readonly_server = None
2018.5.44 by Andrew Bennetts
Small changes to help a couple more tests pass.
2509
        self.__vfs_server = None
1986.2.5 by Robert Collins
Unbreak transport tests.
2510
6499.3.9 by Vincent Ladeuil
Provide fresh config stores for tests.
2511
    def setUp(self):
2512
        super(TestCaseWithMemoryTransport, self).setUp()
2513
2514
        def _add_disconnect_cleanup(transport):
2515
            """Schedule disconnection of given transport at test cleanup
2516
2517
            This needs to happen for all connected transports or leaks occur.
2518
2519
            Note reconnections may mean we call disconnect multiple times per
2520
            transport which is suboptimal but seems harmless.
2521
            """
2522
            self.addCleanup(transport.disconnect)
2523
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2524
        _mod_transport.Transport.hooks.install_named_hook(
2525
            'post_connect', _add_disconnect_cleanup, None)
6499.3.9 by Vincent Ladeuil
Provide fresh config stores for tests.
2526
2527
        self._make_test_root()
6619.3.26 by Martin
Fix fallout from 2to3 getcwdu transformation and other test uses
2528
        self.addCleanup(os.chdir, osutils.getcwd())
6499.3.9 by Vincent Ladeuil
Provide fresh config stores for tests.
2529
        self.makeAndChdirToTestDir()
2530
        self.overrideEnvironmentForTesting()
2531
        self.__readonly_server = None
2532
        self.__server = None
2533
        self.reduceLockdirTimeout()
2534
        # Each test may use its own config files even if the local config files
2535
        # don't actually exist. They'll rightly fail if they try to create them
2536
        # though.
2537
        self.overrideAttr(config, '_shared_stores', {})
2538
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2539
    def get_transport(self, relpath=None):
2540
        """Return a writeable transport.
2541
2542
        This transport is for the test scratch space relative to
2592.2.5 by Jonathan Lange
Make UnicodeFilename feature less insane. Add a simple test for it too.
2543
        "self._test_root"
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2544
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2545
        :param relpath: a path relative to the base url.
2546
        """
6039.1.5 by Jelmer Vernooij
Add get_transport_from_url and get_transport_from_path functions.
2547
        t = _mod_transport.get_transport_from_url(self.get_url(relpath))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2548
        self.assertFalse(t.is_readonly())
2549
        return t
2550
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2551
    def get_readonly_transport(self, relpath=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2552
        """Return a readonly transport for the test scratch space
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2553
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2554
        This can be used to test that operations which should only need
2555
        readonly access in fact do not try to write.
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2556
2557
        :param relpath: a path relative to the base url.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2558
        """
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
2559
        t = _mod_transport.get_transport_from_url(
2560
            self.get_readonly_url(relpath))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2561
        self.assertTrue(t.is_readonly())
2562
        return t
2563
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
2564
    def create_transport_readonly_server(self):
2565
        """Create a transport server from class defined at init.
2566
2145.1.1 by mbp at sourcefrog
merge urllib keepalive etc
2567
        This is mostly a hook for daughter classes.
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
2568
        """
2569
        return self.transport_readonly_server()
2570
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2571
    def get_readonly_server(self):
2572
        """Get the server instance for the readonly transport
2573
2574
        This is useful for some tests with specific servers to do diagnostics.
2575
        """
2576
        if self.__readonly_server is None:
2577
            if self.transport_readonly_server is None:
2578
                # readonly decorator requested
5017.3.23 by Vincent Ladeuil
selftest -s bt.test_bzrdir passing
2579
                self.__readonly_server = test_server.ReadonlyServer()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2580
            else:
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2581
                # explicit readonly transport.
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2582
                self.__readonly_server = (
2583
                    self.create_transport_readonly_server())
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2584
            self.start_server(self.__readonly_server,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2585
                              self.get_vfs_only_server())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2586
        return self.__readonly_server
2587
2588
    def get_readonly_url(self, relpath=None):
2589
        """Get a URL for the readonly transport.
2590
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2591
        This will either be backed by '.' or a decorator to the transport
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2592
        used by self.get_url()
2593
        relpath provides for clients to get a path relative to the base url.
2594
        These should only be downwards relative, not upwards.
2595
        """
2596
        base = self.get_readonly_server().get_url()
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2597
        return self._adjust_url(base, relpath)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2598
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2599
    def get_vfs_only_server(self):
2018.5.44 by Andrew Bennetts
Small changes to help a couple more tests pass.
2600
        """Get the vfs only read/write server instance.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2601
2602
        This is useful for some tests with specific servers that need
2603
        diagnostics.
2604
2605
        For TestCaseWithMemoryTransport this is always a MemoryServer, and there
2606
        is no means to override it.
2607
        """
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2608
        if self.__vfs_server is None:
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
2609
            self.__vfs_server = memory.MemoryServer()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2610
            self.start_server(self.__vfs_server)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2611
        return self.__vfs_server
2612
2613
    def get_server(self):
2614
        """Get the read/write server instance.
2615
2616
        This is useful for some tests with specific servers that need
2617
        diagnostics.
2618
2619
        This is built from the self.transport_server factory. If that is None,
2620
        then the self.get_vfs_server is returned.
2621
        """
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2622
        if self.__server is None:
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2623
            if (self.transport_server is None or self.transport_server is
7143.15.2 by Jelmer Vernooij
Run autopep8.
2624
                    self.vfs_transport_factory):
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2625
                self.__server = self.get_vfs_only_server()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2626
            else:
2627
                # bring up a decorated means of access to the vfs only server.
2628
                self.__server = self.transport_server()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2629
                self.start_server(self.__server, self.get_vfs_only_server())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2630
        return self.__server
2631
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2632
    def _adjust_url(self, base, relpath):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2633
        """Get a URL (or maybe a path) for the readwrite transport.
2634
2635
        This will either be backed by '.' or to an equivalent non-file based
2636
        facility.
2637
        relpath provides for clients to get a path relative to the base url.
2638
        These should only be downwards relative, not upwards.
2639
        """
2640
        if relpath is not None and relpath != '.':
2641
            if not base.endswith('/'):
2642
                base = base + '/'
2643
            # XXX: Really base should be a url; we did after all call
2644
            # get_url()!  But sometimes it's just a path (from
2645
            # LocalAbspathServer), and it'd be wrong to append urlescaped data
2646
            # to a non-escaped local path.
2647
            if base.startswith('./') or base.startswith('/'):
2648
                base += relpath
2649
            else:
2650
                base += urlutils.escape(relpath)
2651
        return base
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2652
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2653
    def get_url(self, relpath=None):
2654
        """Get a URL (or maybe a path) for the readwrite transport.
2655
2656
        This will either be backed by '.' or to an equivalent non-file based
2657
        facility.
2658
        relpath provides for clients to get a path relative to the base url.
2659
        These should only be downwards relative, not upwards.
2660
        """
2661
        base = self.get_server().get_url()
2662
        return self._adjust_url(base, relpath)
2663
2664
    def get_vfs_only_url(self, relpath=None):
2665
        """Get a URL (or maybe a path for the plain old vfs transport.
2666
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2667
        This will never be a smart protocol.  It always has all the
2668
        capabilities of the local filesystem, but it might actually be a
2669
        MemoryTransport or some other similar virtual filesystem.
2670
2399.1.16 by John Arbash Meinel
[merge] bzr.dev 2466
2671
        This is the backing transport (if any) of the server returned by
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2672
        get_url and get_readonly_url.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2673
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2674
        :param relpath: provides for clients to get a path relative to the base
2675
            url.  These should only be downwards relative, not upwards.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2676
        :return: A URL
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2677
        """
2678
        base = self.get_vfs_only_server().get_url()
2679
        return self._adjust_url(base, relpath)
2680
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2681
    def _create_safety_net(self):
2682
        """Make a fake bzr directory.
2683
2875.1.1 by Vincent Ladeuil
Fix #147986 by monitoring a safety .bzr directory.
2684
        This prevents any tests propagating up onto the TEST_ROOT directory's
2685
        real branch.
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2686
        """
2687
        root = TestCaseWithMemoryTransport.TEST_ROOT
6551.1.1 by Vincent Ladeuil
Restore safety net home check lost some time ago.
2688
        try:
7344.2.1 by Martin
Relocate the bzr log file out of $HOME
2689
            # Make sure we get a readable and accessible home for brz.log
6551.1.1 by Vincent Ladeuil
Restore safety net home check lost some time ago.
2690
            # and/or config files, and not fallback to weird defaults (see
2691
            # http://pad.lv/825027).
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
2692
            self.assertIs(None, os.environ.get('BRZ_HOME', None))
2693
            os.environ['BRZ_HOME'] = root
6551.1.1 by Vincent Ladeuil
Restore safety net home check lost some time ago.
2694
            wt = controldir.ControlDir.create_standalone_workingtree(root)
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
2695
            del os.environ['BRZ_HOME']
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
2696
        except Exception as e:
6551.1.2 by Vincent Ladeuil
Fix typo.
2697
            self.fail("Fail to initialize the safety net: %r\n" % (e,))
6017.1.1 by Andrew Bennetts
Quick hack to make _check_safety_net much faster: check raw bytes of the safety net's dirstate against the known pristine state, rather than using WorkingTree.open(root).last_revision().
2698
        # Hack for speed: remember the raw bytes of the dirstate file so that
2699
        # we don't need to re-open the wt to check it hasn't changed.
2700
        TestCaseWithMemoryTransport._SAFETY_NET_PRISTINE_DIRSTATE = (
2701
            wt.control_transport.get_bytes('dirstate'))
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2702
2703
    def _check_safety_net(self):
2704
        """Check that the safety .bzr directory have not been touched.
2705
2706
        _make_test_root have created a .bzr directory to prevent tests from
2707
        propagating. This method ensures than a test did not leaked.
2708
        """
2709
        root = TestCaseWithMemoryTransport.TEST_ROOT
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
2710
        t = _mod_transport.get_transport_from_path(root)
6017.1.1 by Andrew Bennetts
Quick hack to make _check_safety_net much faster: check raw bytes of the safety net's dirstate against the known pristine state, rather than using WorkingTree.open(root).last_revision().
2711
        self.permit_url(t.base)
7143.15.2 by Jelmer Vernooij
Run autopep8.
2712
        if (t.get_bytes('.bzr/checkout/dirstate') !=
6017.1.1 by Andrew Bennetts
Quick hack to make _check_safety_net much faster: check raw bytes of the safety net's dirstate against the known pristine state, rather than using WorkingTree.open(root).last_revision().
2713
                TestCaseWithMemoryTransport._SAFETY_NET_PRISTINE_DIRSTATE):
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2714
            # The current test have modified the /bzr directory, we need to
2715
            # recreate a new one or all the followng tests will fail.
2716
            # If you need to inspect its content uncomment the following line
2717
            # import pdb; pdb.set_trace()
4807.3.3 by John Arbash Meinel
Report the test-id when we fail to delete a testing dir.
2718
            _rmtree_temp_dir(root + '/.bzr', test_id=self.id())
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2719
            self._create_safety_net()
2720
            raise AssertionError('%s/.bzr should not be modified' % root)
2721
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2722
    def _make_test_root(self):
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2723
        if TestCaseWithMemoryTransport.TEST_ROOT is None:
4707.1.1 by Vincent Ladeuil
Fix OSX and FreeBSD failures.
2724
            # Watch out for tricky test dir (on OSX /tmp -> /private/tmp)
2725
            root = osutils.realpath(osutils.mkdtemp(prefix='testbzr-',
2726
                                                    suffix='.tmp'))
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2727
            TestCaseWithMemoryTransport.TEST_ROOT = root
2728
2729
            self._create_safety_net()
2730
2731
            # The same directory is used by all tests, and we're not
2732
            # specifically told when all tests are finished.  This will do.
2733
            atexit.register(_rmtree_temp_dir, root)
2734
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2735
        self.permit_dir(TestCaseWithMemoryTransport.TEST_ROOT)
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2736
        self.addCleanup(self._check_safety_net)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2737
2738
    def makeAndChdirToTestDir(self):
2739
        """Create a temporary directories for this one test.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2740
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2741
        This must set self.test_home_dir and self.test_dir and chdir to
2742
        self.test_dir.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2743
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
2744
        For TestCaseWithMemoryTransport we chdir to the TEST_ROOT for this
2745
        test.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2746
        """
2747
        os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
2748
        self.test_dir = TestCaseWithMemoryTransport.TEST_ROOT
2749
        self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2750
        self.permit_dir(self.test_dir)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2751
6437.32.1 by Aaron Bentley
Use colocated branch names as nicknames.
2752
    def make_branch(self, relpath, format=None, name=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2753
        """Create a branch on the transport at relpath."""
2754
        repo = self.make_repository(relpath, format=format)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
2755
        return repo.controldir.create_branch(append_revisions_only=False, name=name)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2756
6155.6.2 by Jelmer Vernooij
Simplify handling of default format.
2757
    def get_default_format(self):
2758
        return 'default'
2759
2760
    def resolve_format(self, format):
2761
        """Resolve an object to a ControlDir format object.
2762
2763
        The initial format object can either already be
2764
        a ControlDirFormat, None (for the default format),
2765
        or a string with the name of the control dir format.
2766
2767
        :param format: Object to resolve
2768
        :return A ControlDirFormat instance
2769
        """
2770
        if format is None:
2771
            format = self.get_default_format()
6677.1.1 by Martin
Go back to native str for urls and many other py3 changes
2772
        if isinstance(format, str):
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
2773
            format = controldir.format_registry.make_controldir(format)
6123.9.3 by Jelmer Vernooij
Factor out resolve_format method.
2774
        return format
2775
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
2776
    def make_controldir(self, relpath, format=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2777
        try:
2778
            # might be a relative or absolute path
2779
            maybe_a_url = self.get_url(relpath)
2780
            segments = maybe_a_url.rsplit('/', 1)
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2781
            t = _mod_transport.get_transport(maybe_a_url)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2782
            if len(segments) > 1 and segments[-1] not in ('', '.'):
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
2783
                t.ensure_base()
6123.9.3 by Jelmer Vernooij
Factor out resolve_format method.
2784
            format = self.resolve_format(format)
5651.3.3 by Jelmer Vernooij
Remove pdb.
2785
            return format.initialize_on_transport(t)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2786
        except errors.UninitializableFormat:
2787
            raise TestSkipped("Format %s is not initializable." % format)
2788
6150.2.2 by Jelmer Vernooij
Make various make_repository methods default their shared setting to None.
2789
    def make_repository(self, relpath, shared=None, format=None):
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2790
        """Create a repository on our default transport at relpath.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2791
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2792
        Note that relpath must be a relative path, not a full url.
2793
        """
2794
        # FIXME: If you create a remoterepository this returns the underlying
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2795
        # real format, which is incorrect.  Actually we should make sure that
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2796
        # RemoteBzrDir returns a RemoteRepository.
2797
        # maybe  mbp 20070410
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
2798
        made_control = self.make_controldir(relpath, format=format)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2799
        return made_control.create_repository(shared=shared)
2800
5215.3.8 by Marius Kruger
move make_smart_server back to TestCaseWithMemoryTransport from TestCaseWithTransport as per review
2801
    def make_smart_server(self, path, backing_server=None):
2802
        if backing_server is None:
2803
            backing_server = self.get_server()
2804
        smart_server = test_server.SmartTCPServer_for_testing()
2805
        self.start_server(smart_server, backing_server)
6039.1.5 by Jelmer Vernooij
Add get_transport_from_url and get_transport_from_path functions.
2806
        remote_transport = _mod_transport.get_transport_from_url(smart_server.get_url()
7143.15.2 by Jelmer Vernooij
Run autopep8.
2807
                                                                 ).clone(path)
5215.3.8 by Marius Kruger
move make_smart_server back to TestCaseWithMemoryTransport from TestCaseWithTransport as per review
2808
        return remote_transport
2809
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
2810
    def make_branch_and_memory_tree(self, relpath, format=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2811
        """Create a branch on the default transport and a MemoryTree for it."""
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
2812
        b = self.make_branch(relpath, format=format)
6883.8.2 by Jelmer Vernooij
Use create_memorytree.
2813
        return b.create_memorytree()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2814
4476.3.59 by Andrew Bennetts
Undo changes that aren't needed anymore.
2815
    def make_branch_builder(self, relpath, format=None):
4257.3.8 by Andrew Bennetts
Fix TestCase.make_branch_builder to make a branch in the specified format. Also add an interrepo test scenario for KnitPack1 -> KnitPack6RichRoot, which fails.
2816
        branch = self.make_branch(relpath, format=format)
4476.3.59 by Andrew Bennetts
Undo changes that aren't needed anymore.
2817
        return branchbuilder.BranchBuilder(branch=branch)
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
2818
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2819
    def overrideEnvironmentForTesting(self):
4815.2.2 by Michael Hudson
another approach
2820
        test_home_dir = self.test_home_dir
6677.1.1 by Martin
Go back to native str for urls and many other py3 changes
2821
        if not PY3 and isinstance(test_home_dir, text_type):
4815.2.2 by Michael Hudson
another approach
2822
            test_home_dir = test_home_dir.encode(sys.getfilesystemencoding())
5570.3.8 by Vincent Ladeuil
More use cases for overrideEnv.
2823
        self.overrideEnv('HOME', test_home_dir)
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
2824
        self.overrideEnv('BRZ_HOME', test_home_dir)
6770.2.5 by Jelmer Vernooij
Set GNUPGHOME in tests.
2825
        self.overrideEnv('GNUPGHOME', os.path.join(test_home_dir, '.gnupg'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2826
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2827
    def setup_smart_server_with_call_log(self):
2828
        """Sets up a smart server as the transport server with a call log."""
5017.3.23 by Vincent Ladeuil
selftest -s bt.test_bzrdir passing
2829
        self.transport_server = test_server.SmartTCPServer_for_testing
6366.1.3 by Jelmer Vernooij
Support counting number of connections.
2830
        self.hpss_connections = []
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2831
        self.hpss_calls = []
4070.3.1 by Robert Collins
Alter branch sprouting with an alternate fix for stacked branches that does not require multiple copy_content_into and set_parent calls, reducing IO and round trips.
2832
        import traceback
2833
        # Skip the current stack down to the caller of
2834
        # setup_smart_server_with_call_log
2835
        prefix_length = len(traceback.extract_stack()) - 2
7143.15.2 by Jelmer Vernooij
Run autopep8.
2836
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2837
        def capture_hpss_call(params):
4070.3.1 by Robert Collins
Alter branch sprouting with an alternate fix for stacked branches that does not require multiple copy_content_into and set_parent calls, reducing IO and round trips.
2838
            self.hpss_calls.append(
2839
                CapturedCall(params, prefix_length))
7143.15.2 by Jelmer Vernooij
Run autopep8.
2840
6366.1.3 by Jelmer Vernooij
Support counting number of connections.
2841
        def capture_connect(transport):
2842
            self.hpss_connections.append(transport)
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2843
        client._SmartClient.hooks.install_named_hook(
2844
            'call', capture_hpss_call, None)
6366.1.3 by Jelmer Vernooij
Support counting number of connections.
2845
        _mod_transport.Transport.hooks.install_named_hook(
2846
            'post_connect', capture_connect, None)
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2847
2848
    def reset_smart_call_log(self):
2849
        self.hpss_calls = []
6366.1.3 by Jelmer Vernooij
Support counting number of connections.
2850
        self.hpss_connections = []
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2851
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2852
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2853
class TestCaseInTempDir(TestCaseWithMemoryTransport):
2854
    """Derived class that runs a test within a temporary directory.
2855
2856
    This is useful for tests that need to create a branch, etc.
2857
2858
    The directory is created in a slightly complex way: for each
2859
    Python invocation, a new temporary top-level directory is created.
2860
    All test cases create their own directory within that.  If the
2861
    tests complete successfully, the directory is removed.
2862
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2863
    :ivar test_base_dir: The path of the top-level directory for this
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2864
    test, which contains a home directory and a work directory.
2865
2866
    :ivar test_home_dir: An initially empty directory under test_base_dir
2867
    which is used as $HOME for this test.
2868
2869
    :ivar test_dir: A directory under test_base_dir used as the current
2870
    directory when the test proper is run.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2871
    """
2872
2873
    OVERRIDE_PYTHON = 'python'
2874
5984.1.4 by Vincent Ladeuil
Make the test framework more robust against BZR_LOG leaks.
2875
    def setUp(self):
2876
        super(TestCaseInTempDir, self).setUp()
2877
        # Remove the protection set in isolated_environ, we have a proper
2878
        # access to disk resources now.
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
2879
        self.overrideEnv('BRZ_LOG', None)
5984.1.4 by Vincent Ladeuil
Make the test framework more robust against BZR_LOG leaks.
2880
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2881
    def check_file_contents(self, filename, expect):
2882
        self.log("check contents of file %s" % filename)
6973.10.4 by Jelmer Vernooij
Update python3.passing.
2883
        with open(filename, 'rb') as f:
4708.2.2 by Martin
Workingtree changes sitting around since November, more explict closing of files in bzrlib
2884
            contents = f.read()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2885
        if contents != expect:
2886
            self.log("expected: %r" % expect)
2887
            self.log("actually: %r" % contents)
2888
            self.fail("contents of %s not as expected" % filename)
2889
3549.2.4 by Martin Pool
Rename _getTestDirPrefix not to look like a test
2890
    def _getTestDirPrefix(self):
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2891
        # create a directory within the top level test directory
4615.3.1 by Martin
Extend work around for path length limitations in selftest to cygwin
2892
        if sys.platform in ('win32', 'cygwin'):
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2893
            name_prefix = re.sub('[<>*=+",:;_/\\-]', '_', self.id())
2894
            # windows is likely to have path-length limits so use a short name
2895
            name_prefix = name_prefix[-30:]
2896
        else:
2897
            name_prefix = re.sub('[/]', '_', self.id())
2898
        return name_prefix
2899
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2900
    def makeAndChdirToTestDir(self):
2901
        """See TestCaseWithMemoryTransport.makeAndChdirToTestDir().
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2902
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2903
        For TestCaseInTempDir we create a temporary directory based on the test
2904
        name and then create two subdirs - test and home under it.
2905
        """
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
2906
        name_prefix = osutils.pathjoin(TestCaseWithMemoryTransport.TEST_ROOT,
7143.15.2 by Jelmer Vernooij
Run autopep8.
2907
                                       self._getTestDirPrefix())
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2908
        name = name_prefix
2909
        for i in range(100):
2910
            if os.path.exists(name):
2911
                name = name_prefix + '_' + str(i)
2912
            else:
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2913
                # now create test and home directories within this dir
2914
                self.test_base_dir = name
2915
                self.addCleanup(self.deleteTestDir)
2916
                os.mkdir(self.test_base_dir)
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2917
                break
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2918
        self.permit_dir(self.test_base_dir)
2919
        # 'sprouting' and 'init' of a branch both walk up the tree to find
2920
        # stacking policy to honour; create a bzr dir with an unshared
2921
        # repository (but not a branch - our code would be trying to escape
2922
        # then!) to stop them, and permit it to be read.
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
2923
        # control = controldir.ControlDir.create(self.test_base_dir)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2924
        # control.create_repository()
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2925
        self.test_home_dir = self.test_base_dir + '/home'
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2926
        os.mkdir(self.test_home_dir)
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2927
        self.test_dir = self.test_base_dir + '/work'
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2928
        os.mkdir(self.test_dir)
2929
        os.chdir(self.test_dir)
2930
        # put name of test inside
6677.1.1 by Martin
Go back to native str for urls and many other py3 changes
2931
        with open(self.test_base_dir + '/name', 'w') as f:
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2932
            f.write(self.id())
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2933
2934
    def deleteTestDir(self):
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
2935
        os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
4807.3.3 by John Arbash Meinel
Report the test-id when we fail to delete a testing dir.
2936
        _rmtree_temp_dir(self.test_base_dir, test_id=self.id())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2937
2193.2.1 by Alexander Belchenko
selftest: build tree for test with binary line-endings by default
2938
    def build_tree(self, shape, line_endings='binary', transport=None):
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2939
        """Build a test tree according to a pattern.
2940
2941
        shape is a sequence of file specifications.  If the final
2942
        character is '/', a directory is created.
2943
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
2944
        This assumes that all the elements in the tree being built are new.
2945
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2946
        This doesn't add anything to a branch.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2947
3034.4.8 by Alexander Belchenko
TestCaseInTempDir.build_tree now checks type of shape argument.
2948
        :type shape:    list or tuple.
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
2949
        :param line_endings: Either 'binary' or 'native'
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2950
            in binary mode, exact contents are written in native mode, the
2951
            line endings match the default platform endings.
2952
        :param transport: A transport to write to, for building trees on VFS's.
2953
            If the transport is readonly or None, "." is opened automatically.
2954
        :return: None
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2955
        """
3044.1.1 by Martin Pool
Fix up calls to TestCase.build_tree passing a string rather than a list
2956
        if type(shape) not in (list, tuple):
2957
            raise AssertionError("Parameter 'shape' should be "
7143.15.2 by Jelmer Vernooij
Run autopep8.
2958
                                 "a list or a tuple. Got %r instead" % (shape,))
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
2959
        # It's OK to just create them using forward slashes on windows.
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2960
        if transport is None or transport.is_readonly():
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
2961
            transport = _mod_transport.get_transport_from_path(".")
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2962
        for name in shape:
6695.3.1 by Martin
Remove remaining uses of basestring from the codebase
2963
            self.assertIsInstance(name, (str, text_type))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2964
            if name[-1] == '/':
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2965
                transport.mkdir(urlutils.escape(name[:-1]))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2966
            else:
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
2967
                if line_endings == 'binary':
6695.3.1 by Martin
Remove remaining uses of basestring from the codebase
2968
                    end = b'\n'
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
2969
                elif line_endings == 'native':
6695.3.1 by Martin
Remove remaining uses of basestring from the codebase
2970
                    end = os.linesep.encode('ascii')
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
2971
                else:
2227.2.2 by v.ladeuil+lp at free
Cleanup.
2972
                    raise errors.BzrError(
2973
                        'Invalid line ending request %r' % line_endings)
6695.3.1 by Martin
Remove remaining uses of basestring from the codebase
2974
                content = b"contents of %s%s" % (name.encode('utf-8'), end)
1955.3.27 by John Arbash Meinel
rename non_atomic_put_* to put_*non_atomic, and re-order the functions
2975
                transport.put_bytes_non_atomic(urlutils.escape(name), content)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2976
5200.2.4 by Robert Collins
Review feedback.
2977
    build_tree_contents = staticmethod(treeshape.build_tree_contents)
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
2978
2655.2.5 by Marius Kruger
* Improve BzrRemoveChangedFilesError message.
2979
    def assertInWorkingTree(self, path, root_path='.', tree=None):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2980
        """Assert whether path or paths are in the WorkingTree"""
2981
        if tree is None:
2982
            tree = workingtree.WorkingTree.open(root_path)
6695.3.1 by Martin
Remove remaining uses of basestring from the codebase
2983
        if not isinstance(path, (str, text_type)):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2984
            for p in path:
3585.2.1 by Robert Collins
Create acceptance test for bug 150438.
2985
                self.assertInWorkingTree(p, tree=tree)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2986
        else:
6852.3.1 by Jelmer Vernooij
add Tree.is_versioned.
2987
            self.assertTrue(tree.is_versioned(path),
7143.15.2 by Jelmer Vernooij
Run autopep8.
2988
                            path + ' not in working tree.')
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2989
2655.2.5 by Marius Kruger
* Improve BzrRemoveChangedFilesError message.
2990
    def assertNotInWorkingTree(self, path, root_path='.', tree=None):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2991
        """Assert whether path or paths are not in the WorkingTree"""
2992
        if tree is None:
2993
            tree = workingtree.WorkingTree.open(root_path)
6695.3.1 by Martin
Remove remaining uses of basestring from the codebase
2994
        if not isinstance(path, (str, text_type)):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2995
            for p in path:
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
2996
                self.assertNotInWorkingTree(p, tree=tree)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2997
        else:
7143.15.2 by Jelmer Vernooij
Run autopep8.
2998
            self.assertFalse(tree.is_versioned(
2999
                path), path + ' in working tree.')
2227.2.1 by v.ladeuil+lp at free
Small fixes to test suite in the hope that it will facilitate the
3000
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
3001
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
3002
class TestCaseWithTransport(TestCaseInTempDir):
3003
    """A test case that provides get_url and get_readonly_url facilities.
3004
3005
    These back onto two transport servers, one for readonly access and one for
3006
    read write access.
3007
3008
    If no explicit class is provided for readonly access, a
3009
    ReadonlyTransportDecorator is used instead which allows the use of non disk
3010
    based read write transports.
3011
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3012
    If an explicit class is provided for readonly access, that server and the
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
3013
    readwrite one must both define get_url() as resolving to os.getcwd().
3014
    """
3015
6499.3.9 by Vincent Ladeuil
Provide fresh config stores for tests.
3016
    def setUp(self):
3017
        super(TestCaseWithTransport, self).setUp()
3018
        self.__vfs_server = None
3019
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3020
    def get_vfs_only_server(self):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
3021
        """See TestCaseWithMemoryTransport.
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
3022
3023
        This is useful for some tests with specific servers that need
3024
        diagnostics.
3025
        """
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3026
        if self.__vfs_server is None:
3027
            self.__vfs_server = self.vfs_transport_factory()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
3028
            self.start_server(self.__vfs_server)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3029
        return self.__vfs_server
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
3030
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
3031
    def make_branch_and_tree(self, relpath, format=None):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3032
        """Create a branch on the transport and a tree locally.
3033
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
3034
        If the transport is not a LocalTransport, the Tree can't be created on
2381.1.2 by Robert Collins
Fixup the test changes made for hpss to be clean and self contained.
3035
        the transport.  In that case if the vfs_transport_factory is
3036
        LocalURLServer the working tree is created in the local
2018.5.88 by Andrew Bennetts
Clarify make_branch_and_tree docstring a little.
3037
        directory backing the transport, and the returned tree's branch and
2381.1.2 by Robert Collins
Fixup the test changes made for hpss to be clean and self contained.
3038
        repository will also be accessed locally. Otherwise a lightweight
3039
        checkout is created and returned.
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
3040
4650.1.2 by Robert Collins
Remove unnecessary use of an SFTP server connection to test the behaviour of TestCase.make_branch_and_tree.
3041
        We do this because we can't physically create a tree in the local
3042
        path, with a branch reference to the transport_factory url, and
3043
        a branch + repository in the vfs_transport, unless the vfs_transport
3044
        namespace is distinct from the local disk - the two branch objects
3045
        would collide. While we could construct a tree with its branch object
3046
        pointing at the transport_factory transport in memory, reopening it
3047
        would behaving unexpectedly, and has in the past caused testing bugs
3048
        when we tried to do it that way.
3049
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
3050
        :param format: The BzrDirFormat.
3051
        :returns: the WorkingTree.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3052
        """
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
3053
        # TODO: always use the local disk path for the working tree,
3054
        # this obviously requires a format that supports branch references
3055
        # so check for that by checking bzrdir.BzrDirFormat.get_default_format()
3056
        # RBC 20060208
6155.6.7 by Jelmer Vernooij
Simplify
3057
        format = self.resolve_format(format=format)
6182.1.3 by Jelmer Vernooij
Create checkout if bzrdir doesn't support working trees.
3058
        if not format.supports_workingtrees:
7143.15.2 by Jelmer Vernooij
Run autopep8.
3059
            b = self.make_branch(relpath + '.branch', format=format)
6182.1.3 by Jelmer Vernooij
Create checkout if bzrdir doesn't support working trees.
3060
            return b.create_checkout(relpath, lightweight=True)
6155.6.7 by Jelmer Vernooij
Simplify
3061
        b = self.make_branch(relpath, format=format)
3062
        try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
3063
            return b.controldir.create_workingtree()
6155.6.7 by Jelmer Vernooij
Simplify
3064
        except errors.NotLocalUrl:
3065
            # We can only make working trees locally at the moment.  If the
3066
            # transport can't support them, then we keep the non-disk-backed
3067
            # branch and create a local checkout.
3068
            if self.vfs_transport_factory is test_server.LocalURLServer:
3069
                # the branch is colocated on disk, we cannot create a checkout.
3070
                # hopefully callers will expect this.
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
3071
                local_controldir = controldir.ControlDir.open(
3072
                    self.get_vfs_only_url(relpath))
6155.6.7 by Jelmer Vernooij
Simplify
3073
                wt = local_controldir.create_workingtree()
3074
                if wt.branch._format != b._format:
3075
                    wt._branch = b
3076
                    # Make sure that assigning to wt._branch fixes wt.branch,
3077
                    # in case the implementation details of workingtree objects
3078
                    # change.
3079
                    self.assertIs(b, wt.branch)
3080
                return wt
3081
            else:
3082
                return b.create_checkout(relpath, lightweight=True)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3083
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
3084
    def assertIsDirectory(self, relpath, transport):
3085
        """Assert that relpath within transport is a directory.
3086
3087
        This may not be possible on all transports; in that case it propagates
3088
        a TransportNotPossible.
3089
        """
3090
        try:
3091
            mode = transport.stat(relpath).st_mode
3092
        except errors.NoSuchFile:
3093
            self.fail("path %s is not a directory; no such file"
3094
                      % (relpath))
3095
        if not stat.S_ISDIR(mode):
3096
            self.fail("path %s is not a directory; has mode %#o"
3097
                      % (relpath, mode))
3098
1852.13.18 by Robert Collins
Write top level acceptance test for dirstate.
3099
    def assertTreesEqual(self, left, right):
3100
        """Check that left and right have the same content and properties."""
3101
        # we use a tree delta to check for equality of the content, and we
3102
        # manually check for equality of other things such as the parents list.
3103
        self.assertEqual(left.get_parent_ids(), right.get_parent_ids())
3104
        differences = left.changes_from(right)
2255.2.3 by Robert Collins
Split out working tree format 4 to its own file, create stub dirstate revision object, start working on dirstate.set_parent_trees - a key failure point.
3105
        self.assertFalse(differences.has_changed(),
7143.15.2 by Jelmer Vernooij
Run autopep8.
3106
                         "Trees %r and %r are different: %r" % (left, right, differences))
1852.13.18 by Robert Collins
Write top level acceptance test for dirstate.
3107
4695.3.2 by Vincent Ladeuil
Simplified and claried as per Robert's review.
3108
    def disable_missing_extensions_warning(self):
3109
        """Some tests expect a precise stderr content.
3110
3111
        There is no point in forcing them to duplicate the extension related
3112
        warning.
3113
        """
6695.4.3 by Jelmer Vernooij
Fix running of tests without extensions.
3114
        config.GlobalConfig().set_user_option(
3115
            'suppress_warnings', 'missing_extensions')
4695.3.2 by Vincent Ladeuil
Simplified and claried as per Robert's review.
3116
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
3117
1534.4.31 by Robert Collins
cleanedup test_outside_wt
3118
class ChrootedTestCase(TestCaseWithTransport):
3119
    """A support class that provides readonly urls outside the local namespace.
3120
3121
    This is done by checking if self.transport_server is a MemoryServer. if it
3122
    is then we are chrooted already, if it is not then an HttpServer is used
3123
    for readonly urls.
3124
3125
    TODO RBC 20060127: make this an option to TestCaseWithTransport so it can
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3126
                       be used without needed to redo it when a different
1534.4.31 by Robert Collins
cleanedup test_outside_wt
3127
                       subclass is in use ?
3128
    """
3129
3130
    def setUp(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
3131
        from breezy.tests import http_server
1534.4.31 by Robert Collins
cleanedup test_outside_wt
3132
        super(ChrootedTestCase, self).setUp()
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
3133
        if not self.vfs_transport_factory == memory.MemoryServer:
4731.2.9 by Vincent Ladeuil
Implement a new -Ethreads to better track the leaks.
3134
            self.transport_readonly_server = http_server.HttpServer
1534.4.31 by Robert Collins
cleanedup test_outside_wt
3135
3136
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
3137
def condition_id_re(pattern):
3138
    """Create a condition filter which performs a re check on a test's id.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3139
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
3140
    :param pattern: A regular expression string.
3141
    :return: A callable that returns True if the re matches.
3142
    """
5326.2.1 by Parth Malwankar
added InvalidPattern error.
3143
    filter_re = re.compile(pattern, 0)
7143.15.2 by Jelmer Vernooij
Run autopep8.
3144
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
3145
    def condition(test):
3146
        test_id = test.id()
3147
        return filter_re.search(test_id)
3148
    return condition
3149
3150
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
3151
def condition_isinstance(klass_or_klass_list):
3152
    """Create a condition filter which returns isinstance(param, klass).
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3153
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
3154
    :return: A callable which when called with one parameter obj return the
3155
        result of isinstance(obj, klass_or_klass_list).
3156
    """
3157
    def condition(obj):
3158
        return isinstance(obj, klass_or_klass_list)
3159
    return condition
3160
3161
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3162
def condition_id_in_list(id_list):
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
3163
    """Create a condition filter which verify that test's id in a list.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3164
3302.8.4 by Vincent Ladeuil
Cosmetic changes.
3165
    :param id_list: A TestIdList object.
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
3166
    :return: A callable that returns True if the test's id appears in the list.
3167
    """
3168
    def condition(test):
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
3169
        return id_list.includes(test.id())
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
3170
    return condition
3171
3172
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3173
def condition_id_startswith(starts):
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
3174
    """Create a condition filter verifying that test's id starts with a string.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3175
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3176
    :param starts: A list of string.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3177
    :return: A callable that returns True if the test's id starts with one of
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3178
        the given strings.
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
3179
    """
3180
    def condition(test):
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3181
        for start in starts:
3182
            if test.id().startswith(start):
3183
                return True
3184
        return False
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
3185
    return condition
3186
3187
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
3188
def exclude_tests_by_condition(suite, condition):
3189
    """Create a test suite which excludes some tests from suite.
3190
3191
    :param suite: The suite to get tests from.
3192
    :param condition: A callable whose result evaluates True when called with a
3193
        test case which should be excluded from the result.
3194
    :return: A suite which contains the tests found in suite that fail
3195
        condition.
3196
    """
3197
    result = []
3198
    for test in iter_suite_tests(suite):
3199
        if not condition(test):
3200
            result.append(test)
3201
    return TestUtil.TestSuite(result)
3202
3203
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
3204
def filter_suite_by_condition(suite, condition):
3205
    """Create a test suite by filtering another one.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3206
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
3207
    :param suite: The source suite.
3208
    :param condition: A callable whose result evaluates True when called with a
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
3209
        test case which should be included in the result.
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
3210
    :return: A suite which contains the tests found in suite that pass
3211
        condition.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3212
    """
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
3213
    result = []
3214
    for test in iter_suite_tests(suite):
3215
        if condition(test):
3216
            result.append(test)
3217
    return TestUtil.TestSuite(result)
3218
3219
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
3220
def filter_suite_by_re(suite, pattern):
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
3221
    """Create a test suite by filtering another one.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3222
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
3223
    :param suite:           the source suite
3224
    :param pattern:         pattern that names must match
3225
    :returns: the newly created suite
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3226
    """
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
3227
    condition = condition_id_re(pattern)
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
3228
    result_suite = filter_suite_by_condition(suite, condition)
2921.6.4 by Robert Collins
Move the filter implementation of sort_tests_by_re back to filter_tests_by_re.
3229
    return result_suite
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
3230
3231
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
3232
def filter_suite_by_id_list(suite, test_id_list):
3233
    """Create a test suite by filtering another one.
3234
3235
    :param suite: The source suite.
3236
    :param test_id_list: A list of the test ids to keep as strings.
3237
    :returns: the newly created suite
3238
    """
3239
    condition = condition_id_in_list(test_id_list)
3240
    result_suite = filter_suite_by_condition(suite, condition)
3241
    return result_suite
3242
3243
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
3244
def filter_suite_by_id_startswith(suite, start):
3245
    """Create a test suite by filtering another one.
3246
3247
    :param suite: The source suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3248
    :param start: A list of string the test id must start with one of.
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
3249
    :returns: the newly created suite
3250
    """
3251
    condition = condition_id_startswith(start)
3252
    result_suite = filter_suite_by_condition(suite, condition)
3253
    return result_suite
3254
3255
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
3256
def exclude_tests_by_re(suite, pattern):
3257
    """Create a test suite which excludes some tests from suite.
3258
3259
    :param suite: The suite to get tests from.
3260
    :param pattern: A regular expression string. Test ids that match this
3261
        pattern will be excluded from the result.
3262
    :return: A TestSuite that contains all the tests from suite without the
3263
        tests that matched pattern. The order of tests is the same as it was in
3264
        suite.
3265
    """
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
3266
    return exclude_tests_by_condition(suite, condition_id_re(pattern))
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
3267
3268
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
3269
def preserve_input(something):
3270
    """A helper for performing test suite transformation chains.
3271
3272
    :param something: Anything you want to preserve.
3273
    :return: Something.
3274
    """
3275
    return something
3276
3277
3128.1.2 by Vincent Ladeuil
Tweak as per review feedback: s/randomise.*/randomize&/, 0.92 -> 1.0.
3278
def randomize_suite(suite):
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
3279
    """Return a new TestSuite with suite's tests in random order.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3280
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
3281
    The tests in the input suite are flattened into a single suite in order to
3282
    accomplish this. Any nested TestSuites are removed to provide global
3283
    randomness.
3284
    """
2921.6.3 by Robert Collins
* New helper method ``bzrlib.tests.randomise_suite`` which returns a
3285
    tests = list(iter_suite_tests(suite))
3286
    random.shuffle(tests)
3287
    return TestUtil.TestSuite(tests)
3288
3289
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
3290
def split_suite_by_condition(suite, condition):
3291
    """Split a test suite into two by a condition.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3292
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
3293
    :param suite: The suite to split.
3294
    :param condition: The condition to match on. Tests that match this
3295
        condition are returned in the first test suite, ones that do not match
3296
        are in the second suite.
3297
    :return: A tuple of two test suites, where the first contains tests from
3298
        suite matching the condition, and the second contains the remainder
3299
        from suite. The order within each output suite is the same as it was in
3300
        suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3301
    """
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
3302
    matched = []
3303
    did_not_match = []
3304
    for test in iter_suite_tests(suite):
3305
        if condition(test):
3306
            matched.append(test)
3307
        else:
3308
            did_not_match.append(test)
3309
    return TestUtil.TestSuite(matched), TestUtil.TestSuite(did_not_match)
3310
3311
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
3312
def split_suite_by_re(suite, pattern):
3313
    """Split a test suite into two by a regular expression.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3314
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
3315
    :param suite: The suite to split.
3316
    :param pattern: A regular expression string. Test ids that match this
3317
        pattern will be in the first test suite returned, and the others in the
3318
        second test suite returned.
3319
    :return: A tuple of two test suites, where the first contains tests from
3320
        suite matching pattern, and the second contains the remainder from
3321
        suite. The order within each output suite is the same as it was in
3322
        suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3323
    """
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
3324
    return split_suite_by_condition(suite, condition_id_re(pattern))
2213.2.1 by Martin Pool
Add selftest --first flag
3325
3326
1185.16.58 by mbp at sourcefrog
- run all selftests by default
3327
def run_suite(suite, name='test', verbose=False, pattern=".*",
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
3328
              stop_on_failure=False,
2213.2.1 by Martin Pool
Add selftest --first flag
3329
              transport=None, lsprof_timed=None, bench_history=None,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
3330
              matching_tests_first=None,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
3331
              list_only=False,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3332
              random_seed=None,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
3333
              exclude_pattern=None,
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
3334
              strict=False,
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3335
              runner_class=None,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
3336
              suite_decorators=None,
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3337
              stream=None,
3338
              result_decorators=None,
3339
              ):
6622.1.30 by Jelmer Vernooij
Some more test fixes.
3340
    """Run a test suite for brz selftest.
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
3341
3342
    :param runner_class: The class of runner to use. Must support the
3343
        constructor arguments passed by run_suite which are more than standard
3344
        python uses.
3345
    :return: A boolean indicating success.
3346
    """
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
3347
    TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
3348
    if verbose:
3349
        verbosity = 2
3350
    else:
3351
        verbosity = 1
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
3352
    if runner_class is None:
3353
        runner_class = TextTestRunner
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
3354
    if stream is None:
3355
        stream = sys.stdout
3356
    runner = runner_class(stream=stream,
7143.15.2 by Jelmer Vernooij
Run autopep8.
3357
                          descriptions=0,
3358
                          verbosity=verbosity,
3359
                          bench_history=bench_history,
3360
                          strict=strict,
3361
                          result_decorators=result_decorators,
3362
                          )
3363
    runner.stop_on_failure = stop_on_failure
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3364
    if isinstance(suite, unittest.TestSuite):
3365
        # Empty out _tests list of passed suite and populate new TestSuite
3366
        suite._tests[:], suite = [], TestSuite(suite)
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3367
    # built in decorator factories:
3368
    decorators = [
3369
        random_order(random_seed, runner),
3370
        exclude_tests(exclude_pattern),
3371
        ]
3372
    if matching_tests_first:
3373
        decorators.append(tests_first(pattern))
3374
    else:
3375
        decorators.append(filter_tests(pattern))
3376
    if suite_decorators:
3377
        decorators.extend(suite_decorators)
4618.1.1 by Vincent Ladeuil
Make --parallel=fork work again.
3378
    # tell the result object how many tests will be running: (except if
4618.1.2 by Vincent Ladeuil
Fixed as per John's review.
3379
    # --parallel=fork is being used. Robert said he will provide a better
4618.1.1 by Vincent Ladeuil
Make --parallel=fork work again.
3380
    # progress design later -- vila 20090817)
4618.1.2 by Vincent Ladeuil
Fixed as per John's review.
3381
    if fork_decorator not in decorators:
4618.1.1 by Vincent Ladeuil
Make --parallel=fork work again.
3382
        decorators.append(CountingDecorator)
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3383
    for decorator in decorators:
3384
        suite = decorator(suite)
4266.2.1 by Robert Collins
Remove noise from bzr selftest --list-only so that it is easier to use in scripts.
3385
    if list_only:
4650.1.9 by Robert Collins
Detangle test listing: its more part of the ui layer not the execute-this-test-layer.
3386
        # Done after test suite decoration to allow randomisation etc
3387
        # to take effect, though that is of marginal benefit.
3388
        if verbosity >= 2:
3389
            stream.write("Listing tests only ...\n")
6765.1.2 by Jelmer Vernooij
Fix compatibility.
3390
        if getattr(runner, 'list', None) is not None:
3391
            runner.list(suite)
3392
        else:
3393
            for t in iter_suite_tests(suite):
3394
                stream.write("%s\n" % (t.id()))
4266.2.1 by Robert Collins
Remove noise from bzr selftest --list-only so that it is easier to use in scripts.
3395
        return True
4650.1.9 by Robert Collins
Detangle test listing: its more part of the ui layer not the execute-this-test-layer.
3396
    result = runner.run(suite)
7059.1.1 by Martin
Use strict for running Python 3 tests
3397
    if strict and getattr(result, 'wasStrictlySuccessful', False):
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3398
        return result.wasStrictlySuccessful()
3399
    else:
3400
        return result.wasSuccessful()
3401
3402
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3403
# A registry where get() returns a suite decorator.
3404
parallel_registry = registry.Registry()
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3405
3406
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3407
def fork_decorator(suite):
5393.5.2 by Martin
Move check 'closer to the metal' as requested by lifelss in review
3408
    if getattr(os, "fork", None) is None:
3409
        raise errors.BzrCommandError("platform does not support fork,"
7143.15.2 by Jelmer Vernooij
Run autopep8.
3410
                                     " try --parallel=subprocess instead.")
4398.4.3 by Vincent Ladeuil
Detect # cores on win32 and Solaris too.
3411
    concurrency = osutils.local_concurrency()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3412
    if concurrency == 1:
3413
        return suite
3414
    from testtools import ConcurrentTestSuite
3415
    return ConcurrentTestSuite(suite, fork_for_tests)
7143.15.2 by Jelmer Vernooij
Run autopep8.
3416
3417
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3418
parallel_registry.register('fork', fork_decorator)
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3419
3420
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3421
def subprocess_decorator(suite):
4398.4.3 by Vincent Ladeuil
Detect # cores on win32 and Solaris too.
3422
    concurrency = osutils.local_concurrency()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3423
    if concurrency == 1:
3424
        return suite
3425
    from testtools import ConcurrentTestSuite
3426
    return ConcurrentTestSuite(suite, reinvoke_for_tests)
7143.15.2 by Jelmer Vernooij
Run autopep8.
3427
3428
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3429
parallel_registry.register('subprocess', subprocess_decorator)
3430
3431
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3432
def exclude_tests(exclude_pattern):
3433
    """Return a test suite decorator that excludes tests."""
3434
    if exclude_pattern is None:
3435
        return identity_decorator
7143.15.2 by Jelmer Vernooij
Run autopep8.
3436
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3437
    def decorator(suite):
3438
        return ExcludeDecorator(suite, exclude_pattern)
3439
    return decorator
3440
3441
3442
def filter_tests(pattern):
3443
    if pattern == '.*':
3444
        return identity_decorator
7143.15.2 by Jelmer Vernooij
Run autopep8.
3445
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3446
    def decorator(suite):
3447
        return FilterTestsDecorator(suite, pattern)
3448
    return decorator
3449
3450
3451
def random_order(random_seed, runner):
3452
    """Return a test suite decorator factory for randomising tests order.
6621.18.1 by Martin
Remove or fix use of long type and nearby type issues
3453
3454
    :param random_seed: now, a string which casts to an integer, or an integer.
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3455
    :param runner: A test runner with a stream attribute to report on.
3456
    """
3457
    if random_seed is None:
3458
        return identity_decorator
7143.15.2 by Jelmer Vernooij
Run autopep8.
3459
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3460
    def decorator(suite):
3461
        return RandomDecorator(suite, random_seed, runner.stream)
3462
    return decorator
3463
3464
3465
def tests_first(pattern):
3466
    if pattern == '.*':
3467
        return identity_decorator
7143.15.2 by Jelmer Vernooij
Run autopep8.
3468
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3469
    def decorator(suite):
3470
        return TestFirstDecorator(suite, pattern)
3471
    return decorator
3472
3473
3474
def identity_decorator(suite):
3475
    """Return suite."""
3476
    return suite
3477
3478
5247.1.1 by Vincent Ladeuil
Merge previous attempt into current trunk
3479
class TestDecorator(TestUtil.TestSuite):
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3480
    """A decorator for TestCase/TestSuite objects.
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3481
3482
    Contains rather than flattening suite passed on construction
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3483
    """
3484
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3485
    def __init__(self, suite=None):
3486
        super(TestDecorator, self).__init__()
3487
        if suite is not None:
3488
            self.addTest(suite)
3489
3490
    # Don't need subclass run method with suite emptying
3491
    run = unittest.TestSuite.run
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3492
3493
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
3494
class CountingDecorator(TestDecorator):
3495
    """A decorator which calls result.progress(self.countTestCases)."""
3496
3497
    def run(self, result):
3498
        progress_method = getattr(result, 'progress', None)
3499
        if callable(progress_method):
4573.2.3 by Robert Collins
Support python 2.4.
3500
            progress_method(self.countTestCases(), SUBUNIT_SEEK_SET)
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
3501
        return super(CountingDecorator, self).run(result)
3502
3503
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3504
class ExcludeDecorator(TestDecorator):
3505
    """A decorator which excludes test matching an exclude pattern."""
3506
3507
    def __init__(self, suite, exclude_pattern):
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3508
        super(ExcludeDecorator, self).__init__(
3509
            exclude_tests_by_re(suite, exclude_pattern))
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3510
3511
3512
class FilterTestsDecorator(TestDecorator):
3513
    """A decorator which filters tests to those matching a pattern."""
3514
3515
    def __init__(self, suite, pattern):
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3516
        super(FilterTestsDecorator, self).__init__(
3517
            filter_suite_by_re(suite, pattern))
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3518
3519
3520
class RandomDecorator(TestDecorator):
3521
    """A decorator which randomises the order of its tests."""
3522
3523
    def __init__(self, suite, random_seed, stream):
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3524
        random_seed = self.actual_seed(random_seed)
3525
        stream.write("Randomizing test order using seed %s\n\n" %
7143.15.2 by Jelmer Vernooij
Run autopep8.
3526
                     (random_seed,))
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3527
        # Initialise the random number generator.
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3528
        random.seed(random_seed)
3529
        super(RandomDecorator, self).__init__(randomize_suite(suite))
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3530
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3531
    @staticmethod
3532
    def actual_seed(seed):
3533
        if seed == "now":
6621.18.1 by Martin
Remove or fix use of long type and nearby type issues
3534
            # We convert the seed to an integer to make it reuseable across
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3535
            # invocations (because the user can reenter it).
6621.18.1 by Martin
Remove or fix use of long type and nearby type issues
3536
            return int(time.time())
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3537
        else:
6621.18.1 by Martin
Remove or fix use of long type and nearby type issues
3538
            # Convert the seed to an integer if we can
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3539
            try:
6621.18.1 by Martin
Remove or fix use of long type and nearby type issues
3540
                return int(seed)
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3541
            except (TypeError, ValueError):
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3542
                pass
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3543
        return seed
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3544
3545
3546
class TestFirstDecorator(TestDecorator):
3547
    """A decorator which moves named tests to the front."""
3548
3549
    def __init__(self, suite, pattern):
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3550
        super(TestFirstDecorator, self).__init__()
3551
        self.addTests(split_suite_by_re(suite, pattern))
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
3552
3553
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3554
def partition_tests(suite, count):
3555
    """Partition suite into count lists of tests."""
5365.3.1 by Andrew Bennetts
Better (and simpler) algorithm for partition_tests.
3556
    # This just assigns tests in a round-robin fashion.  On one hand this
3557
    # splits up blocks of related tests that might run faster if they shared
3558
    # resources, but on the other it avoids assigning blocks of slow tests to
3559
    # just one partition.  So the slowest partition shouldn't be much slower
3560
    # than the fastest.
3561
    partitions = [list() for i in range(count)]
3562
    tests = iter_suite_tests(suite)
6631.2.2 by Martin
Run 2to3 itertools fixer and refactor
3563
    for partition, test in zip(itertools.cycle(partitions), tests):
5365.3.1 by Andrew Bennetts
Better (and simpler) algorithm for partition_tests.
3564
        partition.append(test)
3565
    return partitions
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3566
3567
5180.2.1 by Vincent Ladeuil
Workaround ``Crypto.Random`` check leading to spurious test failures
3568
def workaround_zealous_crypto_random():
3569
    """Crypto.Random want to help us being secure, but we don't care here.
3570
3571
    This workaround some test failure related to the sftp server. Once paramiko
3572
    stop using the controversial API in Crypto.Random, we may get rid of it.
3573
    """
3574
    try:
3575
        from Crypto.Random import atfork
3576
        atfork()
3577
    except ImportError:
3578
        pass
3579
3580
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3581
def fork_for_tests(suite):
3582
    """Take suite and start up one runner per CPU by forking()
3583
3584
    :return: An iterable of TestCase-like objects which can each have
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3585
        run(result) called on them to feed tests to result.
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3586
    """
4398.4.3 by Vincent Ladeuil
Detect # cores on win32 and Solaris too.
3587
    concurrency = osutils.local_concurrency()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3588
    result = []
5340.16.12 by Martin
Use tweaks for subunit protocol client with --parallel=fork as well as --subunit
3589
    from subunit import ProtocolTestCase
4794.1.20 by Robert Collins
Appropriately guard the import of AutoTimingTestResultDecorator from subunit.
3590
    from subunit.test_results import AutoTimingTestResultDecorator
7143.15.2 by Jelmer Vernooij
Run autopep8.
3591
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3592
    class TestInOtherProcess(ProtocolTestCase):
3593
        # Should be in subunit, I think. RBC.
3594
        def __init__(self, stream, pid):
3595
            ProtocolTestCase.__init__(self, stream)
3596
            self.pid = pid
3597
3598
        def run(self, result):
3599
            try:
3600
                ProtocolTestCase.run(self, result)
3601
            finally:
6221.1.5 by Martin Packman
Note where the child exit status is currently being ignored
3602
                pid, status = os.waitpid(self.pid, 0)
3603
            # GZ 2011-10-18: If status is nonzero, should report to the result
3604
            #                that something went wrong.
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3605
3606
    test_blocks = partition_tests(suite, concurrency)
5340.16.9 by Martin
Tweaks and comments
3607
    # Clear the tests from the original suite so it doesn't keep them alive
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3608
    suite._tests[:] = []
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3609
    for process_tests in test_blocks:
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3610
        process_suite = TestUtil.TestSuite(process_tests)
5340.16.9 by Martin
Tweaks and comments
3611
        # Also clear each split list so new suite has only reference
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3612
        process_tests[:] = []
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3613
        c2pread, c2pwrite = os.pipe()
3614
        pid = os.fork()
3615
        if pid == 0:
3616
            try:
7481.1.2 by Jelmer Vernooij
Fix python3.8 compat.
3617
                stream = os.fdopen(c2pwrite, 'wb', 0)
6221.1.1 by Martin Packman
Move atfork crypto workaround inside safety net
3618
                workaround_zealous_crypto_random()
6954.1.7 by Jelmer Vernooij
Switch to coverage.
3619
                try:
3620
                    import coverage
3621
                except ImportError:
3622
                    pass
3623
                else:
3624
                    coverage.process_startup()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3625
                os.close(c2pread)
3626
                # Leave stderr and stdout open so we can see test noise
3627
                # Close stdin so that the child goes away if it decides to
3628
                # read from stdin (otherwise its a roulette to see what
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3629
                # child actually gets keystrokes for pdb etc).
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3630
                sys.stdin.close()
4794.1.11 by Robert Collins
Remove decorator class that won't be needed with upgraded dependencies.
3631
                subunit_result = AutoTimingTestResultDecorator(
6765.1.4 by Jelmer Vernooij
Fix tests.
3632
                    SubUnitBzrProtocolClientv1(stream))
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3633
                process_suite.run(subunit_result)
6221.1.4 by Martin Packman
Exit with an error if something goes wrong in a forked child and try to show the traceback
3634
            except:
3635
                # Try and report traceback on stream, but exit with error even
6234.2.2 by Martin Packman
Add comment as suggested by poolie in review
3636
                # if stream couldn't be created or something else goes wrong.
3637
                # The traceback is formatted to a string and written in one go
3638
                # to avoid interleaving lines from multiple failing children.
7078.13.2 by Jelmer Vernooij
Only encode tb if necessary.
3639
                tb = traceback.format_exc()
3640
                if isinstance(tb, text_type):
3641
                    tb = tb.encode('utf-8')
6221.1.4 by Martin Packman
Exit with an error if something goes wrong in a forked child and try to show the traceback
3642
                try:
7078.13.2 by Jelmer Vernooij
Only encode tb if necessary.
3643
                    stream.write(tb)
6221.1.4 by Martin Packman
Exit with an error if something goes wrong in a forked child and try to show the traceback
3644
                finally:
7078.13.1 by Jelmer Vernooij
Fix injection of passthrough streams into subunit.
3645
                    stream.flush()
6221.1.4 by Martin Packman
Exit with an error if something goes wrong in a forked child and try to show the traceback
3646
                    os._exit(1)
3647
            os._exit(0)
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3648
        else:
3649
            os.close(c2pwrite)
7481.1.2 by Jelmer Vernooij
Fix python3.8 compat.
3650
            stream = os.fdopen(c2pread, 'rb', 0)
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3651
            test = TestInOtherProcess(stream, pid)
3652
            result.append(test)
3653
    return result
3654
3655
3656
def reinvoke_for_tests(suite):
3657
    """Take suite and start up one runner per CPU using subprocess().
3658
3659
    :return: An iterable of TestCase-like objects which can each have
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3660
        run(result) called on them to feed tests to result.
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3661
    """
4398.4.3 by Vincent Ladeuil
Detect # cores on win32 and Solaris too.
3662
    concurrency = osutils.local_concurrency()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3663
    result = []
4496.3.6 by Andrew Bennetts
Tidy some more imports.
3664
    from subunit import ProtocolTestCase
7143.15.2 by Jelmer Vernooij
Run autopep8.
3665
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3666
    class TestInSubprocess(ProtocolTestCase):
3667
        def __init__(self, process, name):
3668
            ProtocolTestCase.__init__(self, process.stdout)
3669
            self.process = process
3670
            self.process.stdin.close()
3671
            self.name = name
3672
3673
        def run(self, result):
3674
            try:
3675
                ProtocolTestCase.run(self, result)
3676
            finally:
3677
                self.process.wait()
3678
                os.unlink(self.name)
3679
            # print "pid %d finished" % finished_process
3680
    test_blocks = partition_tests(suite, concurrency)
3681
    for process_tests in test_blocks:
3682
        # ugly; currently reimplement rather than reuses TestCase methods.
7143.15.2 by Jelmer Vernooij
Run autopep8.
3683
        bzr_path = os.path.dirname(os.path.dirname(breezy.__file__)) + '/bzr'
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3684
        if not os.path.isfile(bzr_path):
3685
            # We are probably installed. Assume sys.argv is the right file
3686
            bzr_path = sys.argv[0]
4805.2.1 by Gordon Tyler
Fixed reinvoke_for_tests to work on win32.
3687
        bzr_path = [bzr_path]
3688
        if sys.platform == "win32":
3689
            # if we're on windows, we can't execute the bzr script directly
5163.1.3 by Gordon Tyler
Set stdout to binary mode on win32 if --subunit option given to selftest.
3690
            bzr_path = [sys.executable] + bzr_path
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3691
        fd, test_list_file_name = tempfile.mkstemp()
3692
        test_list_file = os.fdopen(fd, 'wb', 1)
3693
        for test in process_tests:
3694
            test_list_file.write(test.id() + '\n')
3695
        test_list_file.close()
3696
        try:
4805.2.1 by Gordon Tyler
Fixed reinvoke_for_tests to work on win32.
3697
            argv = bzr_path + ['selftest', '--load-list', test_list_file_name,
7143.15.2 by Jelmer Vernooij
Run autopep8.
3698
                               '--subunit']
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3699
            if '--no-plugins' in sys.argv:
3700
                argv.append('--no-plugins')
5273.1.3 by Vincent Ladeuil
Fix typo.
3701
            # stderr=subprocess.STDOUT would be ideal, but until we prevent
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
3702
            # noise on stderr it can interrupt the subunit protocol.
5273.1.3 by Vincent Ladeuil
Fix typo.
3703
            process = subprocess.Popen(argv, stdin=subprocess.PIPE,
7143.15.2 by Jelmer Vernooij
Run autopep8.
3704
                                       stdout=subprocess.PIPE,
3705
                                       stderr=subprocess.PIPE,
3706
                                       bufsize=1)
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3707
            test = TestInSubprocess(process, test_list_file_name)
3708
            result.append(test)
3709
        except:
3710
            os.unlink(test_list_file_name)
3711
            raise
3712
    return result
3713
3714
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
3715
class ProfileResult(testtools.ExtendedToOriginalDecorator):
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3716
    """Generate profiling data for all activity between start and success.
7143.15.2 by Jelmer Vernooij
Run autopep8.
3717
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3718
    The profile data is appended to the test's _benchcalls attribute and can
3719
    be accessed by the forwarded-to TestResult.
3720
3721
    While it might be cleaner do accumulate this in stopTest, addSuccess is
3722
    where our existing output support for lsprof is, and this class aims to
3723
    fit in with that: while it could be moved it's not necessary to accomplish
4641.3.4 by Robert Collins
Fix typo.
3724
    test profiling, nor would it be dramatically cleaner.
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3725
    """
3726
3727
    def startTest(self, test):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
3728
        self.profiler = breezy.lsprof.BzrProfiler()
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
3729
        # Prevent deadlocks in tests that use lsprof: those tests will
3730
        # unavoidably fail.
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
3731
        breezy.lsprof.BzrProfiler.profiler_block = 0
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3732
        self.profiler.start()
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
3733
        testtools.ExtendedToOriginalDecorator.startTest(self, test)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3734
3735
    def addSuccess(self, test):
3736
        stats = self.profiler.stop()
3737
        try:
3738
            calls = test._benchcalls
3739
        except AttributeError:
3740
            test._benchcalls = []
3741
            calls = test._benchcalls
3742
        calls.append(((test.id(), "", ""), stats))
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
3743
        testtools.ExtendedToOriginalDecorator.addSuccess(self, test)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3744
3745
    def stopTest(self, test):
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
3746
        testtools.ExtendedToOriginalDecorator.stopTest(self, test)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3747
        self.profiler = None
3748
3749
6622.1.30 by Jelmer Vernooij
Some more test fixes.
3750
# Controlled by "brz selftest -E=..." option
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
3751
# Currently supported:
3752
#   -Eallow_debug           Will no longer clear debug.debug_flags() so it
3753
#                           preserves any flags supplied at the command line.
3754
#   -Edisable_lock_checks   Turns errors in mismatched locks into simple prints
3755
#                           rather than failing tests. And no longer raise
3756
#                           LockContention when fctnl locks are not being used
3757
#                           with proper exclusion rules.
5247.1.2 by Vincent Ladeuil
Fix typo in comment.
3758
#   -Ethreads               Will display thread ident at creation/join time to
4731.2.9 by Vincent Ladeuil
Implement a new -Ethreads to better track the leaks.
3759
#                           help track thread leaks
5340.16.3 by Martin
Use 'uncollected_cases' as the flag name which seems a bit clearer
3760
#   -Euncollected_cases     Display the identity of any test cases that weren't
5340.15.1 by John Arbash Meinel
supersede exc-info branch
3761
#                           deallocated after being completed.
5743.14.17 by Vincent Ladeuil
Fix pqm failure by requiring the right version of testtools :-/
3762
#   -Econfig_stats          Will collect statistics using addDetail
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3763
selftest_debug_flags = set()
3764
3765
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
3766
def selftest(verbose=False, pattern=".*", stop_on_failure=True,
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
3767
             transport=None,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
3768
             test_suite_factory=None,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
3769
             lsprof_timed=None,
2213.2.1 by Martin Pool
Add selftest --first flag
3770
             bench_history=None,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
3771
             matching_tests_first=None,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
3772
             list_only=False,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3773
             random_seed=None,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
3774
             exclude_pattern=None,
3775
             strict=False,
3193.1.8 by Vincent Ladeuil
Add '--load-list' option to selftest.
3776
             load_list=None,
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3777
             debug_flags=None,
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3778
             starting_with=None,
4000.2.3 by Robert Collins
Allow extra options to bzrlib.tests.selftest from plugins.
3779
             runner_class=None,
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3780
             suite_decorators=None,
4636.2.1 by Robert Collins
Test selftest --list-only and --randomize options using more precisely layers.
3781
             stream=None,
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3782
             lsprof_tests=False,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
3783
             ):
1204 by Martin Pool
doc
3784
    """Run the whole test suite under the enhanced runner"""
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
3785
    # XXX: Very ugly way to do this...
3786
    # Disable warning about old formats because we don't want it to disturb
3787
    # any blackbox tests.
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
3788
    from breezy import repository
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
3789
    repository._deprecation_warning_done = True
3790
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
3791
    global default_transport
3792
    if transport is None:
3793
        transport = default_transport
3794
    old_transport = default_transport
3795
    default_transport = transport
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3796
    global selftest_debug_flags
3797
    old_debug_flags = selftest_debug_flags
3798
    if debug_flags is not None:
3799
        selftest_debug_flags = set(debug_flags)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3800
    try:
3193.1.8 by Vincent Ladeuil
Add '--load-list' option to selftest.
3801
        if load_list is None:
3802
            keep_only = None
3803
        else:
3804
            keep_only = load_test_id_list(load_list)
4641.2.1 by Robert Collins
Resolve test aliases at the outermost level that test skip filtering is done.
3805
        if starting_with:
3806
            starting_with = [test_prefix_alias_registry.resolve_alias(start)
3807
                             for start in starting_with]
6754.3.1 by Martin
Always consider unittest as interesting prefix so test load failures are displayed
3808
            # Always consider 'unittest' an interesting name so that failed
3809
            # suites wrapped as test cases appear in the output.
3810
            starting_with.append('unittest')
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
3811
        if test_suite_factory is None:
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
3812
            # Reduce loading time by loading modules based on the starting_with
3813
            # patterns.
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3814
            suite = test_suite(keep_only, starting_with)
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
3815
        else:
3816
            suite = test_suite_factory()
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
3817
        if starting_with:
3818
            # But always filter as requested.
3819
            suite = filter_suite_by_id_startswith(suite, starting_with)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3820
        result_decorators = []
3821
        if lsprof_tests:
3822
            result_decorators.append(ProfileResult)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3823
        return run_suite(suite, 'testbzr', verbose=verbose, pattern=pattern,
7143.15.2 by Jelmer Vernooij
Run autopep8.
3824
                         stop_on_failure=stop_on_failure,
3825
                         transport=transport,
3826
                         lsprof_timed=lsprof_timed,
3827
                         bench_history=bench_history,
3828
                         matching_tests_first=matching_tests_first,
3829
                         list_only=list_only,
3830
                         random_seed=random_seed,
3831
                         exclude_pattern=exclude_pattern,
3832
                         strict=strict,
3833
                         runner_class=runner_class,
3834
                         suite_decorators=suite_decorators,
3835
                         stream=stream,
3836
                         result_decorators=result_decorators,
3837
                         )
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3838
    finally:
3839
        default_transport = old_transport
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3840
        selftest_debug_flags = old_debug_flags
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3841
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
3842
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
3843
def load_test_id_list(file_name):
3844
    """Load a test id list from a text file.
3845
3846
    The format is one test id by line.  No special care is taken to impose
3847
    strict rules, these test ids are used to filter the test suite so a test id
3848
    that do not match an existing test will do no harm. This allows user to add
3849
    comments, leave blank lines, etc.
3850
    """
3851
    test_list = []
3852
    try:
3853
        ftest = open(file_name, 'rt')
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
3854
    except IOError as e:
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
3855
        if e.errno != errno.ENOENT:
3856
            raise
3857
        else:
3858
            raise errors.NoSuchFile(file_name)
3859
3860
    for test_name in ftest.readlines():
3861
        test_list.append(test_name.strip())
3862
    ftest.close()
3863
    return test_list
3864
3302.3.3 by Vincent Ladeuil
Fix PEP8 catched by Aaron. Update NEWS.
3865
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3866
def suite_matches_id_list(test_suite, id_list):
3867
    """Warns about tests not appearing or appearing more than once.
3868
3869
    :param test_suite: A TestSuite object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3870
    :param test_id_list: The list of test ids that should be found in
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3871
         test_suite.
3872
3873
    :return: (absents, duplicates) absents is a list containing the test found
3874
        in id_list but not in test_suite, duplicates is a list containing the
6586.1.1 by Vincent Ladeuil
Fix various typos in docstrings. Rename 'buffer' to 'buf' since it's now a python builtin function.
3875
        tests found multiple times in test_suite.
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3876
3877
    When using a prefined test id list, it may occurs that some tests do not
3878
    exist anymore or that some tests use the same id. This function warns the
3879
    tester about potential problems in his workflow (test lists are volatile)
3880
    or in the test suite itself (using the same id for several tests does not
3881
    help to localize defects).
3882
    """
3883
    # Build a dict counting id occurrences
3884
    tests = dict()
3885
    for test in iter_suite_tests(test_suite):
3886
        id = test.id()
3887
        tests[id] = tests.get(id, 0) + 1
3888
3889
    not_found = []
3890
    duplicates = []
3891
    for id in id_list:
3892
        occurs = tests.get(id, 0)
3893
        if not occurs:
3894
            not_found.append(id)
3895
        elif occurs > 1:
3896
            duplicates.append(id)
3897
3898
    return not_found, duplicates
3899
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
3900
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3901
class TestIdList(object):
3902
    """Test id list to filter a test suite.
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
3903
3904
    Relying on the assumption that test ids are built as:
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3905
    <module>[.<class>.<method>][(<param>+)], <module> being in python dotted
3906
    notation, this class offers methods to :
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
3907
    - avoid building a test suite for modules not refered to in the test list,
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
3908
    - keep only the tests listed from the module test suite.
3909
    """
3910
3911
    def __init__(self, test_id_list):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3912
        # When a test suite needs to be filtered against us we compare test ids
3913
        # for equality, so a simple dict offers a quick and simple solution.
3914
        self.tests = dict().fromkeys(test_id_list, True)
3915
3916
        # While unittest.TestCase have ids like:
3917
        # <module>.<class>.<method>[(<param+)],
3918
        # doctest.DocTestCase can have ids like:
3919
        # <module>
3920
        # <module>.<class>
3921
        # <module>.<function>
3922
        # <module>.<class>.<method>
3923
3924
        # Since we can't predict a test class from its name only, we settle on
3925
        # a simple constraint: a test id always begins with its module name.
3926
3927
        modules = {}
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
3928
        for test_id in test_id_list:
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3929
            parts = test_id.split('.')
3930
            mod_name = parts.pop(0)
3931
            modules[mod_name] = True
3932
            for part in parts:
3933
                mod_name += '.' + part
3934
                modules[mod_name] = True
3935
        self.modules = modules
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
3936
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
3937
    def refers_to(self, module_name):
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
3938
        """Is there tests for the module or one of its sub modules."""
6619.3.1 by Jelmer Vernooij
Apply 2to3 has_key fix.
3939
        return module_name in self.modules
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3940
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
3941
    def includes(self, test_id):
6619.3.1 by Jelmer Vernooij
Apply 2to3 has_key fix.
3942
        return test_id in self.tests
3193.1.5 by Vincent Ladeuil
Add helper method to get only listed tests from a module test suite.
3943
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
3944
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3945
class TestPrefixAliasRegistry(registry.Registry):
3946
    """A registry for test prefix aliases.
3947
3948
    This helps implement shorcuts for the --starting-with selftest
3949
    option. Overriding existing prefixes is not allowed but not fatal (a
3950
    warning will be emitted).
3951
    """
3952
3953
    def register(self, key, obj, help=None, info=None,
3954
                 override_existing=False):
3955
        """See Registry.register.
3956
3957
        Trying to override an existing alias causes a warning to be emitted,
3958
        not a fatal execption.
3959
        """
3960
        try:
3961
            super(TestPrefixAliasRegistry, self).register(
3962
                key, obj, help=help, info=info, override_existing=False)
3963
        except KeyError:
3964
            actual = self.get(key)
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
3965
            trace.note(
3966
                'Test prefix alias %s is already used for %s, ignoring %s'
3967
                % (key, actual, obj))
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3968
3969
    def resolve_alias(self, id_start):
3970
        """Replace the alias by the prefix in the given string.
3971
3649.6.3 by Vincent Ladeuil
Fixed typos as per John's review.
3972
        Using an unknown prefix is an error to help catching typos.
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3973
        """
3974
        parts = id_start.split('.')
3975
        try:
3976
            parts[0] = self.get(parts[0])
3977
        except KeyError:
3978
            raise errors.BzrCommandError(
3979
                '%s is not a known test prefix alias' % parts[0])
3980
        return '.'.join(parts)
3981
3982
3983
test_prefix_alias_registry = TestPrefixAliasRegistry()
3649.6.3 by Vincent Ladeuil
Fixed typos as per John's review.
3984
"""Registry of test prefix aliases."""
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3985
3986
3987
# This alias allows to detect typos ('bzrlin.') by making all valid test ids
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
3988
# appear prefixed ('breezy.' is "replaced" by 'breezy.').
3989
test_prefix_alias_registry.register('breezy', 'breezy')
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3990
5009.1.1 by Vincent Ladeuil
(trivial) Fix typos
3991
# Obvious highest levels prefixes, feel free to add your own via a plugin
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
3992
test_prefix_alias_registry.register('bd', 'breezy.doc')
3993
test_prefix_alias_registry.register('bu', 'breezy.utils')
3994
test_prefix_alias_registry.register('bt', 'breezy.tests')
7295.3.1 by Jelmer Vernooij
Add 'bgt' as alias for 'breezy.git.tests.
3995
test_prefix_alias_registry.register('bgt', 'breezy.git.tests')
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
3996
test_prefix_alias_registry.register('bb', 'breezy.tests.blackbox')
3997
test_prefix_alias_registry.register('bp', 'breezy.plugins')
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3998
3999
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
4000
def _test_suite_testmod_names():
4001
    """Return the standard list of test module names to test."""
4002
    return [
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
4003
        'breezy.git.tests.test_blackbox',
4004
        'breezy.git.tests.test_builder',
4005
        'breezy.git.tests.test_branch',
4006
        'breezy.git.tests.test_cache',
4007
        'breezy.git.tests.test_dir',
4008
        'breezy.git.tests.test_fetch',
4009
        'breezy.git.tests.test_git_remote_helper',
4010
        'breezy.git.tests.test_mapping',
4011
        'breezy.git.tests.test_memorytree',
4012
        'breezy.git.tests.test_object_store',
4013
        'breezy.git.tests.test_pristine_tar',
4014
        'breezy.git.tests.test_push',
4015
        'breezy.git.tests.test_remote',
4016
        'breezy.git.tests.test_repository',
4017
        'breezy.git.tests.test_refs',
4018
        'breezy.git.tests.test_revspec',
4019
        'breezy.git.tests.test_roundtrip',
4020
        'breezy.git.tests.test_server',
4021
        'breezy.git.tests.test_transportgit',
4022
        'breezy.git.tests.test_unpeel_map',
4023
        'breezy.git.tests.test_urls',
4024
        'breezy.git.tests.test_workingtree',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4025
        'breezy.tests.blackbox',
4026
        'breezy.tests.commands',
4027
        'breezy.tests.per_branch',
4028
        'breezy.tests.per_bzrdir',
4029
        'breezy.tests.per_controldir',
4030
        'breezy.tests.per_controldir_colo',
4031
        'breezy.tests.per_foreign_vcs',
4032
        'breezy.tests.per_interrepository',
4033
        'breezy.tests.per_intertree',
4034
        'breezy.tests.per_inventory',
4035
        'breezy.tests.per_interbranch',
4036
        'breezy.tests.per_lock',
4037
        'breezy.tests.per_merger',
4038
        'breezy.tests.per_transport',
4039
        'breezy.tests.per_tree',
4040
        'breezy.tests.per_pack_repository',
4041
        'breezy.tests.per_repository',
4042
        'breezy.tests.per_repository_chk',
4043
        'breezy.tests.per_repository_reference',
4044
        'breezy.tests.per_repository_vf',
4045
        'breezy.tests.per_uifactory',
4046
        'breezy.tests.per_versionedfile',
4047
        'breezy.tests.per_workingtree',
4048
        'breezy.tests.test__annotator',
4049
        'breezy.tests.test__bencode',
4050
        'breezy.tests.test__btree_serializer',
4051
        'breezy.tests.test__chk_map',
4052
        'breezy.tests.test__dirstate_helpers',
4053
        'breezy.tests.test__groupcompress',
4054
        'breezy.tests.test__known_graph',
4055
        'breezy.tests.test__rio',
4056
        'breezy.tests.test__simple_set',
4057
        'breezy.tests.test__static_tuple',
4058
        'breezy.tests.test__walkdirs_win32',
4059
        'breezy.tests.test_ancestry',
4060
        'breezy.tests.test_annotate',
4061
        'breezy.tests.test_atomicfile',
4062
        'breezy.tests.test_bad_files',
6656.2.1 by Jelmer Vernooij
Integrate bisect command into core.
4063
        'breezy.tests.test_bisect',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4064
        'breezy.tests.test_bisect_multi',
4065
        'breezy.tests.test_branch',
4066
        'breezy.tests.test_branchbuilder',
4067
        'breezy.tests.test_btree_index',
4068
        'breezy.tests.test_bugtracker',
4069
        'breezy.tests.test_bundle',
4070
        'breezy.tests.test_bzrdir',
4071
        'breezy.tests.test__chunks_to_lines',
4072
        'breezy.tests.test_cache_utf8',
4073
        'breezy.tests.test_chk_map',
4074
        'breezy.tests.test_chk_serializer',
4075
        'breezy.tests.test_chunk_writer',
4076
        'breezy.tests.test_clean_tree',
4077
        'breezy.tests.test_cleanup',
4078
        'breezy.tests.test_cmdline',
4079
        'breezy.tests.test_commands',
4080
        'breezy.tests.test_commit',
4081
        'breezy.tests.test_commit_merge',
4082
        'breezy.tests.test_config',
7336.2.1 by Martin
Split non-ini config methods to bedding
4083
        'breezy.tests.test_bedding',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4084
        'breezy.tests.test_conflicts',
4085
        'breezy.tests.test_controldir',
4086
        'breezy.tests.test_counted_lock',
4087
        'breezy.tests.test_crash',
4088
        'breezy.tests.test_decorators',
4089
        'breezy.tests.test_delta',
4090
        'breezy.tests.test_debug',
4091
        'breezy.tests.test_diff',
4092
        'breezy.tests.test_directory_service',
4093
        'breezy.tests.test_dirstate',
4094
        'breezy.tests.test_email_message',
4095
        'breezy.tests.test_eol_filters',
4096
        'breezy.tests.test_errors',
4097
        'breezy.tests.test_estimate_compressed_size',
4098
        'breezy.tests.test_export',
4099
        'breezy.tests.test_export_pot',
4100
        'breezy.tests.test_extract',
4101
        'breezy.tests.test_features',
4102
        'breezy.tests.test_fetch',
6651.3.1 by Jelmer Vernooij
Bundle the fetch-ghosts command as hidden command.
4103
        'breezy.tests.test_fetch_ghosts',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4104
        'breezy.tests.test_fixtures',
4105
        'breezy.tests.test_fifo_cache',
4106
        'breezy.tests.test_filters',
4107
        'breezy.tests.test_filter_tree',
4108
        'breezy.tests.test_foreign',
4109
        'breezy.tests.test_generate_docs',
4110
        'breezy.tests.test_generate_ids',
4111
        'breezy.tests.test_globbing',
4112
        'breezy.tests.test_gpg',
4113
        'breezy.tests.test_graph',
7211.14.1 by Jelmer Vernooij
Move grep into core.
4114
        'breezy.tests.test_grep',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4115
        'breezy.tests.test_groupcompress',
4116
        'breezy.tests.test_hashcache',
4117
        'breezy.tests.test_help',
4118
        'breezy.tests.test_hooks',
4119
        'breezy.tests.test_http',
4120
        'breezy.tests.test_http_response',
4121
        'breezy.tests.test_https_ca_bundle',
4122
        'breezy.tests.test_https_urllib',
4123
        'breezy.tests.test_i18n',
4124
        'breezy.tests.test_identitymap',
4125
        'breezy.tests.test_ignores',
4126
        'breezy.tests.test_index',
4127
        'breezy.tests.test_import_tariff',
4128
        'breezy.tests.test_info',
4129
        'breezy.tests.test_inv',
4130
        'breezy.tests.test_inventory_delta',
4131
        'breezy.tests.test_knit',
4132
        'breezy.tests.test_lazy_import',
4133
        'breezy.tests.test_lazy_regex',
4134
        'breezy.tests.test_library_state',
7204.2.1 by Jelmer Vernooij
Move location_to_url to its own module.
4135
        'breezy.tests.test_location',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4136
        'breezy.tests.test_lock',
4137
        'breezy.tests.test_lockable_files',
4138
        'breezy.tests.test_lockdir',
4139
        'breezy.tests.test_log',
4140
        'breezy.tests.test_lru_cache',
4141
        'breezy.tests.test_lsprof',
4142
        'breezy.tests.test_mail_client',
4143
        'breezy.tests.test_matchers',
4144
        'breezy.tests.test_memorytree',
4145
        'breezy.tests.test_merge',
4146
        'breezy.tests.test_merge3',
7143.20.1 by Jelmer Vernooij
Move mergeable functions to breezy.mergeable.
4147
        'breezy.tests.test_mergeable',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4148
        'breezy.tests.test_merge_core',
4149
        'breezy.tests.test_merge_directive',
4150
        'breezy.tests.test_mergetools',
4151
        'breezy.tests.test_missing',
4152
        'breezy.tests.test_msgeditor',
4153
        'breezy.tests.test_multiparent',
7296.7.1 by Jelmer Vernooij
Split out MultiWalker.
4154
        'breezy.tests.test_multiwalker',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4155
        'breezy.tests.test_mutabletree',
4156
        'breezy.tests.test_nonascii',
4157
        'breezy.tests.test_options',
4158
        'breezy.tests.test_osutils',
4159
        'breezy.tests.test_osutils_encodings',
4160
        'breezy.tests.test_pack',
4161
        'breezy.tests.test_patch',
4162
        'breezy.tests.test_patches',
4163
        'breezy.tests.test_permissions',
4164
        'breezy.tests.test_plugins',
4165
        'breezy.tests.test_progress',
7408.3.2 by Jelmer Vernooij
Add some tests.
4166
        'breezy.tests.test_propose',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4167
        'breezy.tests.test_pyutils',
4168
        'breezy.tests.test_read_bundle',
4169
        'breezy.tests.test_reconcile',
4170
        'breezy.tests.test_reconfigure',
4171
        'breezy.tests.test_registry',
4172
        'breezy.tests.test_remote',
4173
        'breezy.tests.test_rename_map',
4174
        'breezy.tests.test_repository',
4175
        'breezy.tests.test_revert',
4176
        'breezy.tests.test_revision',
4177
        'breezy.tests.test_revisionspec',
4178
        'breezy.tests.test_revisiontree',
4179
        'breezy.tests.test_rio',
4180
        'breezy.tests.test_rules',
4181
        'breezy.tests.test_url_policy_open',
4182
        'breezy.tests.test_sampler',
4183
        'breezy.tests.test_scenarios',
4184
        'breezy.tests.test_script',
4185
        'breezy.tests.test_selftest',
4186
        'breezy.tests.test_serializer',
4187
        'breezy.tests.test_setup',
4188
        'breezy.tests.test_sftp_transport',
4189
        'breezy.tests.test_shelf',
4190
        'breezy.tests.test_shelf_ui',
4191
        'breezy.tests.test_smart',
4192
        'breezy.tests.test_smart_add',
4193
        'breezy.tests.test_smart_request',
4194
        'breezy.tests.test_smart_signals',
4195
        'breezy.tests.test_smart_transport',
4196
        'breezy.tests.test_smtp_connection',
4197
        'breezy.tests.test_source',
4198
        'breezy.tests.test_ssh_transport',
4199
        'breezy.tests.test_status',
4200
        'breezy.tests.test_strace',
4201
        'breezy.tests.test_subsume',
4202
        'breezy.tests.test_switch',
4203
        'breezy.tests.test_symbol_versioning',
4204
        'breezy.tests.test_tag',
4205
        'breezy.tests.test_test_server',
4206
        'breezy.tests.test_testament',
4207
        'breezy.tests.test_textfile',
4208
        'breezy.tests.test_textmerge',
4209
        'breezy.tests.test_cethread',
4210
        'breezy.tests.test_timestamp',
4211
        'breezy.tests.test_trace',
4212
        'breezy.tests.test_transactions',
4213
        'breezy.tests.test_transform',
4214
        'breezy.tests.test_transport',
4215
        'breezy.tests.test_transport_log',
4216
        'breezy.tests.test_tree',
4217
        'breezy.tests.test_treebuilder',
4218
        'breezy.tests.test_treeshape',
4219
        'breezy.tests.test_tsort',
4220
        'breezy.tests.test_tuned_gzip',
4221
        'breezy.tests.test_ui',
4222
        'breezy.tests.test_uncommit',
4223
        'breezy.tests.test_upgrade',
4224
        'breezy.tests.test_upgrade_stacked',
6637.1.2 by Jelmer Vernooij
Add tests.
4225
        'breezy.tests.test_upstream_import',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4226
        'breezy.tests.test_urlutils',
4227
        'breezy.tests.test_utextwrap',
4228
        'breezy.tests.test_version',
4229
        'breezy.tests.test_version_info',
4230
        'breezy.tests.test_versionedfile',
4231
        'breezy.tests.test_vf_search',
6734.1.1 by Jelmer Vernooij
Fix more imports.
4232
        'breezy.tests.test_views',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4233
        'breezy.tests.test_weave',
4234
        'breezy.tests.test_whitebox',
4235
        'breezy.tests.test_win32utils',
4236
        'breezy.tests.test_workingtree',
4237
        'breezy.tests.test_workingtree_4',
4238
        'breezy.tests.test_wsgi',
4239
        'breezy.tests.test_xml',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
4240
        ]
4241
4242
4243
def _test_suite_modules_to_doctest():
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
4244
    """Return the list of modules to doctest."""
4245
    if __doc__ is None:
4246
        # GZ 2009-03-31: No docstrings with -OO so there's nothing to doctest
4247
        return []
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
4248
    return [
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4249
        'breezy',
4250
        'breezy.branchbuilder',
6670.4.1 by Jelmer Vernooij
Update imports.
4251
        'breezy.bzr.inventory',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4252
        'breezy.decorators',
4253
        'breezy.iterablefile',
4254
        'breezy.lockdir',
4255
        'breezy.merge3',
4256
        'breezy.option',
4257
        'breezy.pyutils',
4258
        'breezy.symbol_versioning',
4259
        'breezy.tests',
4260
        'breezy.tests.fixtures',
4261
        'breezy.timestamp',
4262
        'breezy.transport.http',
4263
        'breezy.version_info_formats.format_custom',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
4264
        ]
4265
4266
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
4267
def test_suite(keep_only=None, starting_with=None):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4268
    """Build and return TestSuite for the whole of breezy.
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
4269
4270
    :param keep_only: A list of test ids limiting the suite returned.
4271
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
4272
    :param starting_with: An id limiting the suite returned to the tests
4273
         starting with it.
4274
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
4275
    This function can be replaced if you need to change the default test
4276
    suite on a global basis, but it is not encouraged.
4277
    """
3302.9.23 by Vincent Ladeuil
Simplify test_suite().
4278
1707.2.2 by Robert Collins
Start on bench_add, an add benchtest.
4279
    loader = TestUtil.TestLoader()
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
4280
4498.1.2 by Vincent Ladeuil
Fix selftest -s xxx --load yyy usage.
4281
    if keep_only is not None:
4282
        id_filter = TestIdList(keep_only)
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
4283
    if starting_with:
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
4284
        # We take precedence over keep_only because *at loading time* using
4285
        # both options means we will load less tests for the same final result.
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
4286
        def interesting_module(name):
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
4287
            for start in starting_with:
7143.16.12 by Jelmer Vernooij
Fix E131.
4288
                # Either the module name starts with the specified string
4289
                # or it may contain tests starting with the specified string
4290
                if name.startswith(start) or start.startswith(name):
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
4291
                    return True
4292
            return False
3302.11.6 by Vincent Ladeuil
Fixed as per Martin and John reviews. Also fix a bug.
4293
        loader = TestUtil.FilteredByModuleTestLoader(interesting_module)
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
4294
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
4295
    elif keep_only is not None:
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
4296
        loader = TestUtil.FilteredByModuleTestLoader(id_filter.refers_to)
7143.15.2 by Jelmer Vernooij
Run autopep8.
4297
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
4298
        def interesting_module(name):
4299
            return id_filter.refers_to(name)
4300
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
4301
    else:
4302
        loader = TestUtil.TestLoader()
7143.15.2 by Jelmer Vernooij
Run autopep8.
4303
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
4304
        def interesting_module(name):
4305
            # No filtering, all modules are interesting
4306
            return True
4307
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
4308
    suite = loader.suiteClass()
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
4309
4310
    # modules building their suite with loadTestsFromModuleNames
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
4311
    suite.addTest(loader.loadTestsFromModuleNames(_test_suite_testmod_names()))
4312
7055.1.1 by Jelmer Vernooij
Don't run doctests on Python 3.
4313
    if not PY3:
7045.5.7 by Jelmer Vernooij
Skip breezy.doc tests on Python 3.
4314
        suite.addTest(loader.loadTestsFromModuleNames(['breezy.doc']))
4315
7055.1.1 by Jelmer Vernooij
Don't run doctests on Python 3.
4316
        # It's pretty much impossible to write readable doctests that work on
4317
        # both Python 2 and Python 3 because of their overreliance on
4318
        # consistent repr() return values.
4319
        # For now, just run doctests on Python 2 so we now they haven't broken.
4320
        for mod in _test_suite_modules_to_doctest():
4321
            if not interesting_module(mod):
4322
                # No tests to keep here, move along
4323
                continue
4324
            try:
4325
                # note that this really does mean "report only" -- doctest
4326
                # still runs the rest of the examples
4327
                doc_suite = IsolatedDocTestSuite(
4328
                    mod, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
4329
            except ValueError as e:
4330
                print('**failed to get doctest for: %s\n%s' % (mod, e))
4331
                raise
4332
            if len(doc_suite._tests) == 0:
4333
                raise errors.BzrError("no doctests found in %s" % (mod,))
4334
            suite.addTest(doc_suite)
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
4335
2762.2.1 by Robert Collins
* ``bzr plugins`` now lists the version number for each plugin in square
4336
    default_encoding = sys.getdefaultencoding()
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
4337
    for name, plugin in _mod_plugin.plugins().items():
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
4338
        if not interesting_module(plugin.module.__name__):
4339
            continue
3221.4.1 by Martin Pool
Treat failure to load plugin test suites as a fatal error
4340
        plugin_suite = plugin.test_suite()
4341
        # We used to catch ImportError here and turn it into just a warning,
4342
        # but really if you don't have --no-plugins this should be a failure.
4343
        # mbp 20080213 - see http://bugs.launchpad.net/bugs/189771
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
4344
        if plugin_suite is None:
3302.8.21 by Vincent Ladeuil
Fixed as per Robert's review.
4345
            plugin_suite = plugin.load_plugin_tests(loader)
3221.4.1 by Martin Pool
Treat failure to load plugin test suites as a fatal error
4346
        if plugin_suite is not None:
4347
            suite.addTest(plugin_suite)
2762.2.1 by Robert Collins
* ``bzr plugins`` now lists the version number for each plugin in square
4348
        if default_encoding != sys.getdefaultencoding():
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
4349
            trace.warning(
2762.2.1 by Robert Collins
* ``bzr plugins`` now lists the version number for each plugin in square
4350
                'Plugin "%s" tried to reset default encoding to: %s', name,
4351
                sys.getdefaultencoding())
4352
            reload(sys)
4353
            sys.setdefaultencoding(default_encoding)
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
4354
4355
    if keep_only is not None:
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
4356
        # Now that the referred modules have loaded their tests, keep only the
4357
        # requested ones.
4358
        suite = filter_suite_by_id_list(suite, id_filter)
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
4359
        # Do some sanity checks on the id_list filtering
4360
        not_found, duplicates = suite_matches_id_list(suite, keep_only)
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
4361
        if starting_with:
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
4362
            # The tester has used both keep_only and starting_with, so he is
4363
            # already aware that some tests are excluded from the list, there
4364
            # is no need to tell him which.
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
4365
            pass
4366
        else:
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
4367
            # Some tests mentioned in the list are not in the test suite. The
4368
            # list may be out of date, report to the tester.
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
4369
            for id in not_found:
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
4370
                trace.warning('"%s" not found in the test suite', id)
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
4371
        for id in duplicates:
5574.4.1 by Vincent Ladeuil
Cleanup tests imports, they drive me crazy (we had calls for note, trace.log_exception_quietly and bzrlib.trace.warning...)
4372
            trace.warning('"%s" is used as an id by several tests', id)
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
4373
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
4374
    return suite
764 by Martin Pool
- log messages from a particular test are printed if that test fails
4375
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
4376
5462.3.14 by Martin Pool
Unify varations with scenario protocol
4377
def multiply_scenarios(*scenarios):
4378
    """Multiply two or more iterables of scenarios.
4379
4380
    It is safe to pass scenario generators or iterators.
4381
6658.1.1 by Martin
Nibble away at getting test_selftest to pass on Python 3
4382
    :returns: A list of compound scenarios: the cross-product of all
5462.3.20 by Martin Pool
doc
4383
        scenarios, with the names concatenated and the parameters
4384
        merged together.
5462.3.14 by Martin Pool
Unify varations with scenario protocol
4385
    """
6658.1.1 by Martin
Nibble away at getting test_selftest to pass on Python 3
4386
    return functools.reduce(_multiply_two_scenarios, map(list, scenarios))
5462.3.14 by Martin Pool
Unify varations with scenario protocol
4387
4388
4389
def _multiply_two_scenarios(scenarios_left, scenarios_right):
2745.6.58 by Andrew Bennetts
Slightly neater test parameterisation in repository_implementations; extract a 'multiply_scenarios' function.
4390
    """Multiply two sets of scenarios.
4391
4392
    :returns: the cartesian product of the two sets of scenarios, that is
4393
        a scenario for every possible combination of a left scenario and a
4394
        right scenario.
4395
    """
4396
    return [
4397
        ('%s,%s' % (left_name, right_name),
6658.1.1 by Martin
Nibble away at getting test_selftest to pass on Python 3
4398
         dict(left_dict, **right_dict))
2745.6.58 by Andrew Bennetts
Slightly neater test parameterisation in repository_implementations; extract a 'multiply_scenarios' function.
4399
        for left_name, left_dict in scenarios_left
4400
        for right_name, right_dict in scenarios_right]
4401
4402
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4403
def multiply_tests(tests, scenarios, result):
4404
    """Multiply tests_list by scenarios into result.
4405
4406
    This is the core workhorse for test parameterisation.
4407
4408
    Typically the load_tests() method for a per-implementation test suite will
4409
    call multiply_tests and return the result.
4410
4411
    :param tests: The tests to parameterise.
4412
    :param scenarios: The scenarios to apply: pairs of (scenario_name,
4413
        scenario_param_dict).
4414
    :param result: A TestSuite to add created tests to.
4415
4416
    This returns the passed in result TestSuite with the cross product of all
4417
    the tests repeated once for each scenario.  Each test is adapted by adding
4418
    the scenario name at the end of its id(), and updating the test object's
4419
    __dict__ with the scenario_param_dict.
4420
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4421
    >>> import breezy.tests.test_sampler
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4422
    >>> r = multiply_tests(
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4423
    ...     breezy.tests.test_sampler.DemoTest('test_nothing'),
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4424
    ...     [('one', dict(param=1)),
4425
    ...      ('two', dict(param=2))],
5247.1.1 by Vincent Ladeuil
Merge previous attempt into current trunk
4426
    ...     TestUtil.TestSuite())
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4427
    >>> tests = list(iter_suite_tests(r))
4428
    >>> len(tests)
4429
    2
4430
    >>> tests[0].id()
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4431
    'breezy.tests.test_sampler.DemoTest.test_nothing(one)'
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4432
    >>> tests[0].param
4433
    1
4434
    >>> tests[1].param
4435
    2
4436
    """
4437
    for test in iter_suite_tests(tests):
4438
        apply_scenarios(test, scenarios, result)
4439
    return result
4440
4441
4442
def apply_scenarios(test, scenarios, result):
4443
    """Apply the scenarios in scenarios to test and add to result.
4444
4445
    :param test: The test to apply scenarios to.
4446
    :param scenarios: An iterable of scenarios to apply to test.
4447
    :return: result
4448
    :seealso: apply_scenario
4449
    """
4450
    for scenario in scenarios:
4451
        result.addTest(apply_scenario(test, scenario))
4452
    return result
4453
4454
4455
def apply_scenario(test, scenario):
4456
    """Copy test and apply scenario to it.
4457
4458
    :param test: A test to adapt.
6586.1.1 by Vincent Ladeuil
Fix various typos in docstrings. Rename 'buffer' to 'buf' since it's now a python builtin function.
4459
    :param scenario: A tuple describing the scenario.
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4460
        The first element of the tuple is the new test id.
4461
        The second element is a dict containing attributes to set on the
4462
        test.
4463
    :return: The adapted test.
4464
    """
4465
    new_id = "%s(%s)" % (test.id(), scenario[0])
4466
    new_test = clone_test(test, new_id)
4467
    for name, value in scenario[1].items():
4468
        setattr(new_test, name, value)
4469
    return new_test
4470
4471
4472
def clone_test(test, new_id):
4473
    """Clone a test giving it a new id.
4474
4475
    :param test: The test to clone.
4476
    :param new_id: The id to assign to it.
4477
    :return: The new test.
4478
    """
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
4479
    new_test = copy.copy(test)
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4480
    new_test.id = lambda: new_id
5050.33.6 by Andrew Bennetts
Replace __copy__ hack with more direct workaround in clone_test.
4481
    # XXX: Workaround <https://bugs.launchpad.net/testtools/+bug/637725>, which
4482
    # causes cloned tests to share the 'details' dict.  This makes it hard to
4483
    # read the test output for parameterized tests, because tracebacks will be
4484
    # associated with irrelevant tests.
4485
    try:
4486
        details = new_test._TestCase__details
4487
    except AttributeError:
4488
        # must be a different version of testtools than expected.  Do nothing.
4489
        pass
4490
    else:
4491
        # Reset the '__details' dict.
4492
        new_test._TestCase__details = {}
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4493
    return new_test
3004.1.5 by Daniel Watkins
Added adapt_tests which will adapt tests at a finer-than-module level.
4494
4495
4913.3.1 by John Arbash Meinel
Implement a permute_for_extension helper.
4496
def permute_tests_for_extension(standard_tests, loader, py_module_name,
4497
                                ext_module_name):
4913.3.6 by John Arbash Meinel
Add doc string for permute_tests_for_extension.
4498
    """Helper for permutating tests against an extension module.
4499
4500
    This is meant to be used inside a modules 'load_tests()' function. It will
4501
    create 2 scenarios, and cause all tests in the 'standard_tests' to be run
4502
    against both implementations. Setting 'test.module' to the appropriate
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4503
    module. See breezy.tests.test__chk_map.load_tests as an example.
4913.3.6 by John Arbash Meinel
Add doc string for permute_tests_for_extension.
4504
4505
    :param standard_tests: A test suite to permute
4506
    :param loader: A TestLoader
4507
    :param py_module_name: The python path to a python module that can always
4508
        be loaded, and will be considered the 'python' implementation. (eg
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
4509
        'breezy._chk_map_py')
4913.3.6 by John Arbash Meinel
Add doc string for permute_tests_for_extension.
4510
    :param ext_module_name: The python path to an extension module. If the
4511
        module cannot be loaded, a single test will be added, which notes that
4512
        the module is not available. If it can be loaded, all standard_tests
4513
        will be run against that module.
4514
    :return: (suite, feature) suite is a test-suite that has all the permuted
4515
        tests. feature is the Feature object that can be used to determine if
4516
        the module is available.
4517
    """
4518
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
4519
    from .features import ModuleAvailableFeature
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
4520
    py_module = pyutils.get_named_object(py_module_name)
4913.3.1 by John Arbash Meinel
Implement a permute_for_extension helper.
4521
    scenarios = [
4522
        ('python', {'module': py_module}),
4523
    ]
4524
    suite = loader.suiteClass()
4525
    feature = ModuleAvailableFeature(ext_module_name)
4526
    if feature.available():
4527
        scenarios.append(('C', {'module': feature.module}))
4528
    else:
4529
        # the compiled module isn't available, so we add a failing test
4530
        class FailWithoutFeature(TestCase):
4531
            def test_fail(self):
4532
                self.requireFeature(feature)
4533
        suite.addTest(loader.loadTestsFromTestCase(FailWithoutFeature))
4534
    result = multiply_tests(standard_tests, scenarios, suite)
4535
    return result, feature
4536
4537
4807.3.3 by John Arbash Meinel
Report the test-id when we fail to delete a testing dir.
4538
def _rmtree_temp_dir(dirname, test_id=None):
2485.6.4 by Martin Pool
Move unicode handling code into _rmtree_temp_dir
4539
    # If LANG=C we probably have created some bogus paths
4540
    # which rmtree(unicode) will fail to delete
4541
    # so make sure we are using rmtree(str) to delete everything
4542
    # except on win32, where rmtree(str) will fail
4543
    # since it doesn't have the property of byte-stream paths
4544
    # (they are either ascii or mbcs)
6677.1.1 by Martin
Go back to native str for urls and many other py3 changes
4545
    if sys.platform == 'win32' and isinstance(dirname, bytes):
2485.6.4 by Martin Pool
Move unicode handling code into _rmtree_temp_dir
4546
        # make sure we are using the unicode win32 api
6677.1.1 by Martin
Go back to native str for urls and many other py3 changes
4547
        dirname = dirname.decode('mbcs')
2485.6.4 by Martin Pool
Move unicode handling code into _rmtree_temp_dir
4548
    else:
4549
        dirname = dirname.encode(sys.getfilesystemencoding())
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
4550
    try:
4551
        osutils.rmtree(dirname)
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
4552
    except OSError as e:
4615.3.2 by Vincent Ladeuil
Allows selftest to finish even without fully cleaning the test dir.
4553
        # We don't want to fail here because some useful display will be lost
4554
        # otherwise. Polluting the tmp dir is bad, but not giving all the
4555
        # possible info to the test runner is even worse.
7183.3.1 by Martin
Fix E71* lint errors
4556
        if test_id is not None:
4807.3.3 by John Arbash Meinel
Report the test-id when we fail to delete a testing dir.
4557
            ui.ui_factory.clear_term()
4857.1.1 by John Arbash Meinel
Add an extra newline. It seems that calling clear_term() just isn't enough.
4558
            sys.stderr.write('\nWhile running: %s\n' % (test_id,))
5229.1.4 by Vincent Ladeuil
Tested, explain the intent.
4559
        # Ugly, but the last thing we want here is fail, so bear with it.
5229.1.5 by Vincent Ladeuil
Even more paranoid fix.
4560
        printable_e = str(e).decode(osutils.get_user_encoding(), 'replace'
5229.1.3 by Vincent Ladeuil
The test should go on !
4561
                                    ).encode('ascii', 'replace')
4615.3.2 by Vincent Ladeuil
Allows selftest to finish even without fully cleaning the test dir.
4562
        sys.stderr.write('Unable to remove testing dir %s\n%s'
5229.1.2 by Vincent Ladeuil
First try at fixing the unicode encoding error.
4563
                         % (os.path.basename(dirname), printable_e))
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
4564
4565
2785.1.5 by Alexander Belchenko
support for non-ascii BZR_HOME in show_version()
4566
def probe_unicode_in_user_encoding():
4567
    """Try to encode several unicode strings to use in unicode-aware tests.
4568
    Return first successfull match.
4569
4570
    :return:  (unicode value, encoded plain string value) or (None, None)
4571
    """
4572
    possible_vals = [u'm\xb5', u'\xe1', u'\u0410']
4573
    for uni_val in possible_vals:
4574
        try:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
4575
            str_val = uni_val.encode(osutils.get_user_encoding())
2785.1.5 by Alexander Belchenko
support for non-ascii BZR_HOME in show_version()
4576
        except UnicodeEncodeError:
4577
            # Try a different character
4578
            pass
4579
        else:
4580
            return uni_val, str_val
4581
    return None, None
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4582
4583
2839.6.2 by Alexander Belchenko
changes after Martin's review
4584
def probe_bad_non_ascii(encoding):
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4585
    """Try to find [bad] character with code [128..255]
2839.6.2 by Alexander Belchenko
changes after Martin's review
4586
    that cannot be decoded to unicode in some encoding.
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4587
    Return None if all non-ascii characters is valid
2839.6.2 by Alexander Belchenko
changes after Martin's review
4588
    for given encoding.
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4589
    """
6651.2.2 by Martin
Apply 2to3 xrange fix and fix up with sixish range
4590
    for i in range(128, 256):
7045.4.8 by Jelmer Vernooij
Fix another 128 tests on python 3.
4591
        char = int2byte(i)
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4592
        try:
2839.6.2 by Alexander Belchenko
changes after Martin's review
4593
            char.decode(encoding)
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4594
        except UnicodeDecodeError:
4595
            return char
4596
    return None
2917.3.1 by Vincent Ladeuil
Separate transport from test server.
4597
4598
4165.1.1 by Robert Collins
Add builtin subunit support.
4599
# Only define SubUnitBzrRunner if subunit is available.
4600
try:
4601
    from subunit import TestProtocolClient
4794.1.20 by Robert Collins
Appropriately guard the import of AutoTimingTestResultDecorator from subunit.
4602
    from subunit.test_results import AutoTimingTestResultDecorator
6765.1.3 by Jelmer Vernooij
Add --subunit2 option.
4603
4604
    class SubUnitBzrProtocolClientv1(TestProtocolClient):
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
4605
5340.16.6 by Martin
Fix subunit collection tests on Python 2.7 with a little copy code
4606
        def stopTest(self, test):
6765.1.3 by Jelmer Vernooij
Add --subunit2 option.
4607
            super(SubUnitBzrProtocolClientv1, self).stopTest(test)
5340.16.14 by Martin
Factor out _type_equality_funcs to a new function
4608
            _clear__type_equality_funcs(test)
5340.16.6 by Martin
Fix subunit collection tests on Python 2.7 with a little copy code
4609
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
4610
        def addSuccess(self, test, details=None):
4611
            # The subunit client always includes the details in the subunit
4612
            # stream, but we don't want to include it in ours.
5387.2.9 by John Arbash Meinel
Have to handle when details is None
4613
            if details is not None and 'log' in details:
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
4614
                del details['log']
6765.1.3 by Jelmer Vernooij
Add --subunit2 option.
4615
            return super(SubUnitBzrProtocolClientv1, self).addSuccess(
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
4616
                test, details)
4617
6765.1.3 by Jelmer Vernooij
Add --subunit2 option.
4618
    class SubUnitBzrRunnerv1(TextTestRunner):
4619
4165.1.1 by Robert Collins
Add builtin subunit support.
4620
        def run(self, test):
4794.1.11 by Robert Collins
Remove decorator class that won't be needed with upgraded dependencies.
4621
            result = AutoTimingTestResultDecorator(
6765.1.3 by Jelmer Vernooij
Add --subunit2 option.
4622
                SubUnitBzrProtocolClientv1(self.stream))
4165.1.1 by Robert Collins
Add builtin subunit support.
4623
            test.run(result)
4624
            return result
4625
except ImportError:
4626
    pass
6765.1.3 by Jelmer Vernooij
Add --subunit2 option.
4627
4628
4629
try:
4630
    from subunit.run import SubunitTestRunner
4631
4632
    class SubUnitBzrRunnerv2(TextTestRunner, SubunitTestRunner):
4633
4634
        def __init__(self, stream=sys.stderr, descriptions=0, verbosity=1,
4635
                     bench_history=None, strict=False, result_decorators=None):
4636
            TextTestRunner.__init__(
7143.15.2 by Jelmer Vernooij
Run autopep8.
4637
                self, stream=stream,
4638
                descriptions=descriptions, verbosity=verbosity,
4639
                bench_history=bench_history, strict=strict,
4640
                result_decorators=result_decorators)
6765.1.3 by Jelmer Vernooij
Add --subunit2 option.
4641
            SubunitTestRunner.__init__(self, verbosity=verbosity,
4642
                                       stream=stream)
4643
4644
        run = SubunitTestRunner.run
4645
except ImportError:
4646
    pass