/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4070.8.3 by Martin Pool
Finish debug_flags support and add a test case
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 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
609 by Martin Pool
- cleanup test code
17
1535 by Martin Pool
todo idea from John
18
# TODO: Perhaps there should be an API to find out if bzr running under the
19
# test suite -- some plugins might want to avoid making intrusive changes if
20
# this is the case.  However, we want behaviour under to test to diverge as
21
# little as possible, so this should be used rarely if it's added at all.
22
# (Suggestion from j-a-meinel, 2005-11-24)
23
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
24
# NOTE: Some classes in here use camelCaseNaming() rather than
25
# underscore_naming().  That's for consistency with unittest; it's not the
26
# general style of bzrlib.  Please continue that consistency when adding e.g.
27
# new assertFoo() methods.
28
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
29
import atexit
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
30
import codecs
1185.1.29 by Robert Collins
merge merge tweaks from aaron, which includes latest .dev
31
from cStringIO import StringIO
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
32
import difflib
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
33
import doctest
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
34
import errno
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
35
import logging
36
import os
2255.2.185 by Martin Pool
assertEqual uses pformat to show results
37
from pprint import pformat
2394.2.2 by Ian Clatworthy
Add --randomize and update help
38
import random
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
39
import re
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
40
import shlex
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
41
import stat
1752.1.1 by Aaron Bentley
Add run_bzr_external
42
from subprocess import Popen, PIPE
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
43
import sys
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
44
import tempfile
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
45
import threading
3084.1.1 by Andrew Bennetts
Add a --coverage option to selftest.
46
import time
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
47
import unittest
2485.6.5 by Martin Pool
Remove keep_output option
48
import warnings
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
49
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
50
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
51
from bzrlib import (
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
52
    branchbuilder,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
53
    bzrdir,
54
    debug,
55
    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.
56
    hooks,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
57
    memorytree,
58
    osutils,
59
    progress,
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
60
    ui,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
61
    urlutils,
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
62
    registry,
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
63
    workingtree,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
64
    )
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
65
import bzrlib.branch
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
66
import bzrlib.commands
1551.12.28 by Aaron Bentley
Move bundle timestamp code to timestamp
67
import bzrlib.timestamp
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
68
import bzrlib.export
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
69
import bzrlib.inventory
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
70
import bzrlib.iterablefile
1553.5.19 by Martin Pool
Run lockdir doctests
71
import bzrlib.lockdir
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
72
try:
73
    import bzrlib.lsprof
74
except ImportError:
75
    # lsprof not available
76
    pass
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
77
from bzrlib.merge import merge_inner
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
78
import bzrlib.merge3
79
import bzrlib.plugin
4160.2.4 by Andrew Bennetts
Use BzrDir pre_open hook to jail request code from accessing transports other than the backing transport.
80
from bzrlib.smart import client, request, server
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
81
import bzrlib.store
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
82
from bzrlib import symbol_versioning
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
83
from bzrlib.symbol_versioning import (
2921.6.5 by Robert Collins
* The ``exclude_pattern`` parameter to the ``bzrlib.tests.`` functions
84
    DEPRECATED_PARAMETER,
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
85
    deprecated_function,
86
    deprecated_method,
2921.6.5 by Robert Collins
* The ``exclude_pattern`` parameter to the ``bzrlib.tests.`` functions
87
    deprecated_passed,
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
88
    )
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
89
import bzrlib.trace
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
90
from bzrlib.transport import get_transport
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
91
import bzrlib.transport
1951.2.1 by Martin Pool
Change to using LocalURLServer for testing.
92
from bzrlib.transport.local import LocalURLServer
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
93
from bzrlib.transport.memory import MemoryServer
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
94
from bzrlib.transport.readonly import ReadonlyServer
2095.4.1 by Martin Pool
Better progress bars during tests
95
from bzrlib.trace import mutter, note
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
96
from bzrlib.tests import TestUtil
2929.3.7 by Vincent Ladeuil
Rename bzrlib/test/HttpServer.py to bzrlib/tests/http_server.py and fix uses.
97
from bzrlib.tests.http_server import HttpServer
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
98
from bzrlib.tests.TestUtil import (
99
                          TestSuite,
100
                          TestLoader,
101
                          )
1514 by Robert Collins
Unbreak self.build_tree_shape in tests.
102
from bzrlib.tests.treeshape import build_tree_contents
2948.4.1 by Lukáš Lalinský
Custom template-based version info formatter.
103
import bzrlib.version_info_formats.format_custom
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.
104
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
105
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)
106
# Mark this python module as being part of the implementation
107
# of unittest: this gives us better tracebacks where the last
108
# shown frame is the test code, not our assertXYZ.
2598.5.7 by Aaron Bentley
Updates from review
109
__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)
110
1951.2.1 by Martin Pool
Change to using LocalURLServer for testing.
111
default_transport = 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.
112
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
113
2095.4.1 by Martin Pool
Better progress bars during tests
114
class ExtendedTestResult(unittest._TextTestResult):
115
    """Accepts, reports and accumulates the results of running tests.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
116
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
117
    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
118
    profiling, benchmarking, stopping as soon as a test fails,  and
119
    skipping tests.  There are further-specialized subclasses for
120
    different types of display.
121
122
    When a test finishes, in whatever way, it calls one of the addSuccess,
123
    addFailure or addError classes.  These in turn may redirect to a more
124
    specific case for the special test results supported by our extended
125
    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
126
127
    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
128
    """
2095.4.1 by Martin Pool
Better progress bars during tests
129
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
130
    stop_early = False
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
131
2095.4.1 by Martin Pool
Better progress bars during tests
132
    def __init__(self, stream, descriptions, verbosity,
133
                 bench_history=None,
134
                 num_tests=None,
135
                 ):
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
136
        """Construct new TestResult.
137
138
        :param bench_history: Optionally, a writable file object to accumulate
139
            benchmark results.
140
        """
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
141
        unittest._TextTestResult.__init__(self, stream, descriptions, verbosity)
1819.1.1 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Give the test result object an optional benchmark
142
        if bench_history is not None:
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
143
            from bzrlib.version import _get_bzr_source_tree
144
            src_tree = _get_bzr_source_tree()
145
            if src_tree:
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
146
                try:
147
                    revision_id = src_tree.get_parent_ids()[0]
148
                except IndexError:
149
                    # XXX: if this is a brand new tree, do the same as if there
150
                    # is no branch.
151
                    revision_id = ''
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
152
            else:
153
                # XXX: If there's no branch, what should we do?
154
                revision_id = ''
1819.1.4 by Jan Balster
save the revison id for every benchmark run in .perf-history
155
            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
156
        self._bench_history = bench_history
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
157
        self.ui = ui.ui_factory
2095.4.1 by Martin Pool
Better progress bars during tests
158
        self.num_tests = num_tests
159
        self.error_count = 0
160
        self.failure_count = 0
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
161
        self.known_failure_count = 0
2095.4.1 by Martin Pool
Better progress bars during tests
162
        self.skip_count = 0
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
163
        self.not_applicable_count = 0
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
164
        self.unsupported = {}
2095.4.1 by Martin Pool
Better progress bars during tests
165
        self.count = 0
166
        self._overall_start_time = time.time()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
167
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
168
    def _extractBenchmarkTime(self, testCase):
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
169
        """Add a benchmark time for the current test case."""
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
170
        return getattr(testCase, "_benchtime", None)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
171
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
172
    def _elapsedTestTimeString(self):
173
        """Return a time string for the overall time the current test has taken."""
174
        return self._formatTime(time.time() - self._start_time)
175
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
176
    def _testTimeString(self, testCase):
177
        benchmark_time = self._extractBenchmarkTime(testCase)
178
        if benchmark_time is not 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).
179
            return "%s/%s" % (
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
180
                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).
181
                self._elapsedTestTimeString())
182
        else:
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
183
            return "           %s" % 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).
184
185
    def _formatTime(self, seconds):
186
        """Format seconds as milliseconds with leading spaces."""
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
187
        # some benchmarks can take thousands of seconds to run, so we need 8
188
        # places
189
        return "%8dms" % (1000 * seconds)
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
190
2095.4.1 by Martin Pool
Better progress bars during tests
191
    def _shortened_test_description(self, test):
192
        what = test.id()
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
193
        what = re.sub(r'^bzrlib\.(tests|benchmarks)\.', '', what)
2095.4.1 by Martin Pool
Better progress bars during tests
194
        return what
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
195
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
196
    def startTest(self, test):
197
        unittest.TestResult.startTest(self, test)
2095.4.1 by Martin Pool
Better progress bars during tests
198
        self.report_test_start(test)
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
199
        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).
200
        self._recordTestStartTime()
201
202
    def _recordTestStartTime(self):
203
        """Record that a test has started."""
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
204
        self._start_time = time.time()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
205
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
206
    def _cleanupLogFile(self, test):
207
        # We can only do this if we have one of our TestCases, not if
208
        # we have a doctest.
209
        setKeepLogfile = getattr(test, 'setKeepLogfile', None)
210
        if setKeepLogfile is not None:
211
            setKeepLogfile()
212
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
213
    def addError(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
214
        """Tell result that test finished with an error.
215
216
        Called from the TestCase run() method when the test
217
        fails with an unexpected error.
218
        """
219
        self._testConcluded(test)
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
220
        if isinstance(err[1], TestNotApplicable):
221
            return self._addNotApplicable(test, err)
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
222
        elif isinstance(err[1], UnavailableFeature):
223
            return self.addNotSupported(test, err[1].args[0])
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
224
        else:
225
            unittest.TestResult.addError(self, test, err)
226
            self.error_count += 1
227
            self.report_error(test, err)
228
            if self.stop_early:
229
                self.stop()
3517.4.15 by Martin Pool
Remove dead code
230
            self._cleanupLogFile(test)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
231
232
    def addFailure(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
233
        """Tell result that test failed.
234
235
        Called from the TestCase run() method when the test
236
        fails because e.g. an assert() method failed.
237
        """
238
        self._testConcluded(test)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
239
        if isinstance(err[1], KnownFailure):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
240
            return self._addKnownFailure(test, err)
241
        else:
242
            unittest.TestResult.addFailure(self, test, err)
243
            self.failure_count += 1
244
            self.report_failure(test, err)
245
            if self.stop_early:
246
                self.stop()
3517.4.15 by Martin Pool
Remove dead code
247
            self._cleanupLogFile(test)
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
248
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
249
    def addSuccess(self, test):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
250
        """Tell result that test completed successfully.
251
252
        Called from the TestCase run()
253
        """
254
        self._testConcluded(test)
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
255
        if self._bench_history is not None:
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
            benchmark_time = self._extractBenchmarkTime(test)
257
            if benchmark_time is not None:
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
258
                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
259
                    self._formatTime(benchmark_time),
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
260
                    test.id()))
2095.4.1 by Martin Pool
Better progress bars during tests
261
        self.report_success(test)
3199.1.1 by Vincent Ladeuil
Get rid of ~1000 useless log files out of 10.000 tests in /tmp.
262
        self._cleanupLogFile(test)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
263
        unittest.TestResult.addSuccess(self, test)
3224.4.4 by Andrew Bennetts
Tweak clearing of _log_contents (idea from John).
264
        test._log_contents = ''
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
265
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
266
    def _testConcluded(self, test):
267
        """Common code when a test has finished.
268
269
        Called regardless of whether it succeded, failed, etc.
270
        """
3199.1.1 by Vincent Ladeuil
Get rid of ~1000 useless log files out of 10.000 tests in /tmp.
271
        pass
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
272
273
    def _addKnownFailure(self, test, err):
274
        self.known_failure_count += 1
275
        self.report_known_failure(test, err)
276
277
    def addNotSupported(self, test, feature):
278
        """The test will not be run because of a missing feature.
279
        """
280
        # this can be called in two different ways: it may be that the
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
281
        # test started running, and then raised (through addError)
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
282
        # UnavailableFeature.  Alternatively this method can be called
283
        # while probing for features before running the tests; in that
284
        # case we will see startTest and stopTest, but the test will never
285
        # actually run.
286
        self.unsupported.setdefault(str(feature), 0)
287
        self.unsupported[str(feature)] += 1
288
        self.report_unsupported(test, feature)
289
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
290
    def addSkip(self, test, reason):
291
        """A test has not run for 'reason'."""
292
        self.skip_count += 1
293
        self.report_skip(test, reason)
294
295
    def _addNotApplicable(self, test, skip_excinfo):
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
296
        if isinstance(skip_excinfo[1], TestNotApplicable):
297
            self.not_applicable_count += 1
298
            self.report_not_applicable(test, skip_excinfo)
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
299
        try:
300
            test.tearDown()
301
        except KeyboardInterrupt:
302
            raise
303
        except:
4063.1.3 by Robert Collins
Python2.4 compatibility.
304
            self.addError(test, test.exc_info())
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
305
        else:
2729.1.4 by Martin Pool
merge trunk
306
            # seems best to treat this as success from point-of-view of unittest
307
            # -- it actually does nothing so it barely matters :)
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
308
            unittest.TestResult.addSuccess(self, test)
3224.4.6 by Andrew Bennetts
Tweak another _log_contents clearing.
309
            test._log_contents = ''
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
310
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
311
    def printErrorList(self, flavour, errors):
312
        for test, err in errors:
313
            self.stream.writeln(self.separator1)
2321.3.2 by Alexander Belchenko
numbered dirs: printErrorList show test number for NUMBERED_DIRS
314
            self.stream.write("%s: " % flavour)
315
            self.stream.writeln(self.getDescription(test))
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
316
            if getattr(test, '_get_log', None) is not None:
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
317
                self.stream.write('\n')
2911.6.3 by Blake Winton
Implemented suggestions from John Arbash Meinel.
318
                self.stream.write(
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
319
                        ('vvvv[log from %s]' % test.id()).ljust(78,'-'))
320
                self.stream.write('\n')
321
                self.stream.write(test._get_log())
322
                self.stream.write('\n')
2911.6.3 by Blake Winton
Implemented suggestions from John Arbash Meinel.
323
                self.stream.write(
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
324
                        ('^^^^[log from %s]' % test.id()).ljust(78,'-'))
325
                self.stream.write('\n')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
326
            self.stream.writeln(self.separator2)
327
            self.stream.writeln("%s" % err)
328
2095.4.1 by Martin Pool
Better progress bars during tests
329
    def finished(self):
330
        pass
331
332
    def report_cleaning_up(self):
333
        pass
334
335
    def report_success(self, test):
336
        pass
337
2658.3.1 by Daniel Watkins
Added ExtendedTestResult.wasStrictlySuccessful.
338
    def wasStrictlySuccessful(self):
339
        if self.unsupported or self.known_failure_count:
340
            return False
341
        return self.wasSuccessful()
342
343
2095.4.1 by Martin Pool
Better progress bars during tests
344
class TextTestResult(ExtendedTestResult):
345
    """Displays progress and results of tests in text form"""
346
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
347
    def __init__(self, stream, descriptions, verbosity,
348
                 bench_history=None,
349
                 num_tests=None,
350
                 pb=None,
351
                 ):
352
        ExtendedTestResult.__init__(self, stream, descriptions, verbosity,
2598.4.1 by Martin Pool
Remove obsolete --clean-output, --keep-output, --numbered-dirs selftest options (thanks Alexander)
353
            bench_history, num_tests)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
354
        if pb is None:
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
355
            self.pb = self.ui.nested_progress_bar()
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
356
            self._supplied_pb = False
357
        else:
358
            self.pb = pb
359
            self._supplied_pb = True
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
360
        self.pb.show_pct = False
361
        self.pb.show_spinner = False
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
362
        self.pb.show_eta = False,
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
363
        self.pb.show_count = False
364
        self.pb.show_bar = False
365
2095.4.1 by Martin Pool
Better progress bars during tests
366
    def report_starting(self):
4103.3.2 by Martin Pool
Remove trailing punctuation from progress messages
367
        self.pb.update('[test 0/%d] Starting' % (self.num_tests))
2095.4.1 by Martin Pool
Better progress bars during tests
368
369
    def _progress_prefix_text(self):
3297.1.1 by Martin Pool
More concise display of test progress bar
370
        # the longer this text, the less space we have to show the test
371
        # name...
372
        a = '[%d' % self.count              # total that have been run
373
        # tests skipped as known not to be relevant are not important enough
374
        # to show here
375
        ## if self.skip_count:
376
        ##     a += ', %d skip' % self.skip_count
377
        ## if self.known_failure_count:
378
        ##     a += '+%dX' % self.known_failure_count
2095.4.1 by Martin Pool
Better progress bars during tests
379
        if self.num_tests is not None:
380
            a +='/%d' % self.num_tests
3297.1.1 by Martin Pool
More concise display of test progress bar
381
        a += ' in '
382
        runtime = time.time() - self._overall_start_time
383
        if runtime >= 60:
384
            a += '%dm%ds' % (runtime / 60, runtime % 60)
385
        else:
386
            a += '%ds' % runtime
3297.1.3 by Martin Pool
Fix up selftest progress tests
387
        if self.error_count:
388
            a += ', %d err' % self.error_count
389
        if self.failure_count:
390
            a += ', %d fail' % self.failure_count
391
        if self.unsupported:
392
            a += ', %d missing' % len(self.unsupported)
2095.4.3 by Martin Pool
Tweak test display a bit more
393
        a += ']'
2095.4.1 by Martin Pool
Better progress bars during tests
394
        return a
395
396
    def report_test_start(self, test):
397
        self.count += 1
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
398
        self.pb.update(
2095.4.1 by Martin Pool
Better progress bars during tests
399
                self._progress_prefix_text()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
400
                + ' '
2095.4.1 by Martin Pool
Better progress bars during tests
401
                + self._shortened_test_description(test))
402
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
403
    def _test_description(self, test):
2598.4.1 by Martin Pool
Remove obsolete --clean-output, --keep-output, --numbered-dirs selftest options (thanks Alexander)
404
        return self._shortened_test_description(test)
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
405
2095.4.3 by Martin Pool
Tweak test display a bit more
406
    def report_error(self, test, err):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
407
        self.pb.note('ERROR: %s\n    %s\n',
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
408
            self._test_description(test),
2095.4.3 by Martin Pool
Tweak test display a bit more
409
            err[1],
2134.1.1 by Henri Wiechers
Changed TextTestResult's report methods to avoid % formatting in calls to ProgressBar.note(), instead args are passed and note() handles the formatting. This prevents bugs where note() might be passed a string with %'s in it because one of the args contain %'s.
410
            )
2095.4.1 by Martin Pool
Better progress bars during tests
411
2095.4.3 by Martin Pool
Tweak test display a bit more
412
    def report_failure(self, test, err):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
413
        self.pb.note('FAIL: %s\n    %s\n',
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
414
            self._test_description(test),
2095.4.3 by Martin Pool
Tweak test display a bit more
415
            err[1],
2134.1.1 by Henri Wiechers
Changed TextTestResult's report methods to avoid % formatting in calls to ProgressBar.note(), instead args are passed and note() handles the formatting. This prevents bugs where note() might be passed a string with %'s in it because one of the args contain %'s.
416
            )
2095.4.1 by Martin Pool
Better progress bars during tests
417
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
418
    def report_known_failure(self, test, err):
419
        self.pb.note('XFAIL: %s\n%s\n',
420
            self._test_description(test), err[1])
421
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
422
    def report_skip(self, test, reason):
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
423
        pass
424
425
    def report_not_applicable(self, test, skip_excinfo):
426
        pass
2095.4.1 by Martin Pool
Better progress bars during tests
427
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
428
    def report_unsupported(self, test, feature):
429
        """test cannot be run because feature is missing."""
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
430
2095.4.1 by Martin Pool
Better progress bars during tests
431
    def report_cleaning_up(self):
4103.3.2 by Martin Pool
Remove trailing punctuation from progress messages
432
        self.pb.update('Cleaning up')
2095.4.1 by Martin Pool
Better progress bars during tests
433
434
    def finished(self):
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
435
        if not self._supplied_pb:
436
            self.pb.finished()
2095.4.1 by Martin Pool
Better progress bars during tests
437
438
439
class VerboseTestResult(ExtendedTestResult):
440
    """Produce long output, with one line per test run plus times"""
441
442
    def _ellipsize_to_right(self, a_string, final_width):
443
        """Truncate and pad a string, keeping the right hand side"""
444
        if len(a_string) > final_width:
445
            result = '...' + a_string[3-final_width:]
446
        else:
447
            result = a_string
448
        return result.ljust(final_width)
449
450
    def report_starting(self):
451
        self.stream.write('running %d tests...\n' % self.num_tests)
452
453
    def report_test_start(self, test):
454
        self.count += 1
455
        name = self._shortened_test_description(test)
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
456
        # width needs space for 6 char status, plus 1 for slash, plus 2 10-char
457
        # numbers, plus a trailing blank
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
458
        # when NUMBERED_DIRS: plus 5 chars on test number, plus 1 char on space
2598.4.1 by Martin Pool
Remove obsolete --clean-output, --keep-output, --numbered-dirs selftest options (thanks Alexander)
459
        self.stream.write(self._ellipsize_to_right(name,
460
                          osutils.terminal_width()-30))
2095.4.1 by Martin Pool
Better progress bars during tests
461
        self.stream.flush()
462
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
463
    def _error_summary(self, err):
464
        indent = ' ' * 4
465
        return '%s%s' % (indent, err[1])
466
2095.4.3 by Martin Pool
Tweak test display a bit more
467
    def report_error(self, test, err):
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
468
        self.stream.writeln('ERROR %s\n%s'
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
469
                % (self._testTimeString(test),
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
470
                   self._error_summary(err)))
2095.4.1 by Martin Pool
Better progress bars during tests
471
2095.4.3 by Martin Pool
Tweak test display a bit more
472
    def report_failure(self, test, err):
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
473
        self.stream.writeln(' FAIL %s\n%s'
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
474
                % (self._testTimeString(test),
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
475
                   self._error_summary(err)))
2095.4.1 by Martin Pool
Better progress bars during tests
476
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
477
    def report_known_failure(self, test, err):
478
        self.stream.writeln('XFAIL %s\n%s'
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
479
                % (self._testTimeString(test),
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
480
                   self._error_summary(err)))
481
2095.4.1 by Martin Pool
Better progress bars during tests
482
    def report_success(self, test):
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
483
        self.stream.writeln('   OK %s' % self._testTimeString(test))
2095.4.1 by Martin Pool
Better progress bars during tests
484
        for bench_called, stats in getattr(test, '_benchcalls', []):
485
            self.stream.writeln('LSProf output for %s(%s, %s)' % bench_called)
486
            stats.pprint(file=self.stream)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
487
        # flush the stream so that we get smooth output. This verbose mode is
488
        # used to show the output in PQM.
2095.4.1 by Martin Pool
Better progress bars during tests
489
        self.stream.flush()
490
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
491
    def report_skip(self, test, reason):
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
492
        self.stream.writeln(' SKIP %s\n%s'
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
493
                % (self._testTimeString(test), reason))
2095.4.1 by Martin Pool
Better progress bars during tests
494
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
495
    def report_not_applicable(self, test, skip_excinfo):
496
        self.stream.writeln('  N/A %s\n%s'
2729.1.5 by Martin Pool
Update report_not_applicable for _testTimeString fix
497
                % (self._testTimeString(test),
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
498
                   self._error_summary(skip_excinfo)))
499
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
500
    def report_unsupported(self, test, feature):
501
        """test cannot be run because feature is missing."""
502
        self.stream.writeln("NODEP %s\n    The feature '%s' is not available."
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
503
                %(self._testTimeString(test), feature))
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
504
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
505
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
506
class TextTestRunner(object):
1185.16.58 by mbp at sourcefrog
- run all selftests by default
507
    stop_on_failure = False
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
508
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
509
    def __init__(self,
510
                 stream=sys.stderr,
511
                 descriptions=0,
512
                 verbosity=1,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
513
                 bench_history=None,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
514
                 list_only=False
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
515
                 ):
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
516
        self.stream = unittest._WritelnDecorator(stream)
517
        self.descriptions = descriptions
518
        self.verbosity = verbosity
1819.1.2 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Add a benchmark output parameter to TextTestRunner.
519
        self._bench_history = bench_history
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
520
        self.list_only = list_only
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
521
522
    def run(self, test):
523
        "Run the given test case or test suite."
524
        startTime = time.time()
2095.4.1 by Martin Pool
Better progress bars during tests
525
        if self.verbosity == 1:
526
            result_class = TextTestResult
527
        elif self.verbosity >= 2:
528
            result_class = VerboseTestResult
529
        result = result_class(self.stream,
530
                              self.descriptions,
531
                              self.verbosity,
532
                              bench_history=self._bench_history,
533
                              num_tests=test.countTestCases(),
534
                              )
535
        result.stop_early = self.stop_on_failure
536
        result.report_starting()
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
537
        if self.list_only:
2394.2.2 by Ian Clatworthy
Add --randomize and update help
538
            if self.verbosity >= 2:
539
                self.stream.writeln("Listing tests only ...\n")
540
            run = 0
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
541
            for t in iter_suite_tests(test):
542
                self.stream.writeln("%s" % (t.id()))
2394.2.2 by Ian Clatworthy
Add --randomize and update help
543
                run += 1
544
            actionTaken = "Listed"
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
545
        else:
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
546
            test.run(result)
2394.2.2 by Ian Clatworthy
Add --randomize and update help
547
            run = result.testsRun
548
            actionTaken = "Ran"
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
549
        stopTime = time.time()
550
        timeTaken = stopTime - startTime
551
        result.printErrors()
552
        self.stream.writeln(result.separator2)
2394.2.2 by Ian Clatworthy
Add --randomize and update help
553
        self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
554
                            run, run != 1 and "s" or "", timeTaken))
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
555
        self.stream.writeln()
556
        if not result.wasSuccessful():
557
            self.stream.write("FAILED (")
558
            failed, errored = map(len, (result.failures, result.errors))
559
            if failed:
560
                self.stream.write("failures=%d" % failed)
561
            if errored:
562
                if failed: self.stream.write(", ")
563
                self.stream.write("errors=%d" % errored)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
564
            if result.known_failure_count:
565
                if failed or errored: self.stream.write(", ")
566
                self.stream.write("known_failure_count=%d" %
567
                    result.known_failure_count)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
568
            self.stream.writeln(")")
569
        else:
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
570
            if result.known_failure_count:
571
                self.stream.writeln("OK (known_failures=%d)" %
572
                    result.known_failure_count)
573
            else:
574
                self.stream.writeln("OK")
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
575
        if result.skip_count > 0:
576
            skipped = result.skip_count
577
            self.stream.writeln('%d test%s skipped' %
578
                                (skipped, skipped != 1 and "s" or ""))
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
579
        if result.unsupported:
580
            for feature, count in sorted(result.unsupported.items()):
581
                self.stream.writeln("Missing feature '%s' skipped %d tests." %
582
                    (feature, count))
2095.4.1 by Martin Pool
Better progress bars during tests
583
        result.finished()
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
584
        return result
585
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
586
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
587
def iter_suite_tests(suite):
588
    """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.
589
    if isinstance(suite, unittest.TestCase):
590
        yield suite
591
    elif isinstance(suite, unittest.TestSuite):
592
        for item in suite._tests:
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
593
            for r in iter_suite_tests(item):
594
                yield r
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
595
    else:
596
        raise Exception('unknown type %r for object %r'
597
                        % (type(suite), suite))
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
598
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
599
600
class TestSkipped(Exception):
601
    """Indicates that a test was intentionally skipped, rather than failing."""
602
603
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
604
class TestNotApplicable(TestSkipped):
605
    """A test is not applicable to the situation where it was run.
606
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
607
    This is only normally raised by parameterized tests, if they find that
608
    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
609
    of its interface.
610
    """
611
612
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
613
class KnownFailure(AssertionError):
614
    """Indicates that a test failed in a precisely expected manner.
615
616
    Such failures dont block the whole test suite from passing because they are
617
    indicators of partially completed code or of future work. We have an
618
    explicit error for them so that we can ensure that they are always visible:
619
    KnownFailures are always shown in the output of bzr selftest.
620
    """
621
622
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
623
class UnavailableFeature(Exception):
624
    """A feature required for this test was not available.
625
626
    The feature should be used to construct the exception.
627
    """
628
629
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
630
class CommandFailed(Exception):
631
    pass
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
632
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
633
634
class StringIOWrapper(object):
635
    """A wrapper around cStringIO which just adds an encoding attribute.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
636
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
637
    Internally we can check sys.stdout to see what the output encoding
638
    should be. However, cStringIO has no encoding attribute that we can
639
    set. So we wrap it instead.
640
    """
641
    encoding='ascii'
642
    _cstring = None
643
644
    def __init__(self, s=None):
645
        if s is not None:
646
            self.__dict__['_cstring'] = StringIO(s)
647
        else:
648
            self.__dict__['_cstring'] = StringIO()
649
650
    def __getattr__(self, name, getattr=getattr):
651
        return getattr(self.__dict__['_cstring'], name)
652
653
    def __setattr__(self, name, val):
654
        if name == 'encoding':
655
            self.__dict__['encoding'] = val
656
        else:
657
            return setattr(self._cstring, name, val)
658
659
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
660
class TestUIFactory(ui.CLIUIFactory):
661
    """A UI Factory for testing.
662
663
    Hide the progress bar but emit note()s.
664
    Redirect stdin.
665
    Allows get_password to be tested without real tty attached.
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
666
    """
667
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
668
    def __init__(self,
669
                 stdout=None,
670
                 stderr=None,
671
                 stdin=None):
672
        super(TestUIFactory, self).__init__()
673
        if stdin is not None:
674
            # We use a StringIOWrapper to be able to test various
675
            # encodings, but the user is still responsible to
676
            # encode the string and to set the encoding attribute
677
            # of StringIOWrapper.
678
            self.stdin = StringIOWrapper(stdin)
679
        if stdout is None:
680
            self.stdout = sys.stdout
681
        else:
682
            self.stdout = stdout
683
        if stderr is None:
684
            self.stderr = sys.stderr
685
        else:
686
            self.stderr = stderr
687
688
    def clear(self):
689
        """See progress.ProgressBar.clear()."""
690
691
    def clear_term(self):
692
        """See progress.ProgressBar.clear_term()."""
693
694
    def clear_term(self):
695
        """See progress.ProgressBar.clear_term()."""
696
697
    def finished(self):
698
        """See progress.ProgressBar.finished()."""
699
700
    def note(self, fmt_string, *args, **kwargs):
701
        """See progress.ProgressBar.note()."""
702
        self.stdout.write((fmt_string + "\n") % args)
703
704
    def progress_bar(self):
705
        return self
706
707
    def nested_progress_bar(self):
708
        return self
709
710
    def update(self, message, count=None, total=None):
711
        """See progress.ProgressBar.update()."""
712
713
    def get_non_echoed_password(self, prompt):
714
        """Get password from stdin without trying to handle the echo mode"""
715
        if prompt:
2461.1.1 by Vincent Ladeuil
Fix 110204 by letting TestUIFactory encode password prompt.
716
            self.stdout.write(prompt.encode(self.stdout.encoding, 'replace'))
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
717
        password = self.stdin.readline()
718
        if not password:
719
            raise EOFError
720
        if password[-1] == '\n':
721
            password = password[:-1]
722
        return password
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
723
724
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
725
def _report_leaked_threads():
726
    bzrlib.trace.warning('%s is leaking threads among %d leaking tests',
727
                         TestCase._first_thread_leaker_id,
728
                         TestCase._leaking_threads_tests)
729
730
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
731
class TestCase(unittest.TestCase):
732
    """Base class for bzr unit tests.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
733
734
    Tests that need access to disk resources should subclass
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
735
    TestCaseInTempDir not TestCase.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
736
737
    Error and debug log messages are redirected from their usual
738
    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.
739
    retrieved by _get_log().  We use a real OS file, not an in-memory object,
740
    so that it can also capture file IO.  When the test completes this file
741
    is read into memory and removed from disk.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
742
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
743
    There are also convenience functions to invoke bzr's command-line
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
744
    routine, and to build and check bzr trees.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
745
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
746
    In addition to the usual method of overriding tearDown(), this class also
747
    allows subclasses to register functions into the _cleanups list, which is
748
    run in order as the object is torn down.  It's less likely this will be
749
    accidentally overlooked.
750
    """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
751
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
752
    _active_threads = None
753
    _leaking_threads_tests = 0
754
    _first_thread_leaker_id = None
1185.16.14 by Martin Pool
- make TestCase._get_log work even if setup was aborted
755
    _log_file_name = None
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
756
    _log_contents = ''
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
757
    _keep_log_file = False
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
758
    # record lsprof data when performing benchmark calls.
759
    _gather_lsprof_in_benchmarks = False
3405.1.1 by Robert Collins
(robertc) Preserve test ids correctly to aid debugging. (Robert Collins, Andrew Bennetts)
760
    attrs_to_keep = ('id', '_testMethodName', '_testMethodDoc',
3224.4.9 by Andrew Bennetts
Add _TestCase__testMethodName to attrs_to_keep, for compatibility with Python 2.4.
761
                     '_log_contents', '_log_file_name', '_benchtime',
762
                     '_TestCase__testMethodName')
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
763
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
764
    def __init__(self, methodName='testMethod'):
765
        super(TestCase, self).__init__(methodName)
766
        self._cleanups = []
4153.1.1 by Andrew Bennetts
Check that TestCase.setUp was called in TestCase.run. If not, fail the test.
767
        self._bzr_test_setUp_run = False
4153.1.3 by Andrew Bennetts
Check that bzrlib.tests.TestCase.tearDown is called too.
768
        self._bzr_test_tearDown_run = False
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
769
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
770
    def setUp(self):
771
        unittest.TestCase.setUp(self)
4153.1.1 by Andrew Bennetts
Check that TestCase.setUp was called in TestCase.run. If not, fail the test.
772
        self._bzr_test_setUp_run = True
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
773
        self._cleanEnvironment()
2095.4.1 by Martin Pool
Better progress bars during tests
774
        self._silenceUI()
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
775
        self._startLogFile()
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
776
        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)
777
        self._benchtime = None
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
778
        self._clear_hooks()
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
779
        self._clear_debug_flags()
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
780
        TestCase._active_threads = threading.activeCount()
781
        self.addCleanup(self._check_leaked_threads)
782
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.
783
    def debug(self):
784
        # debug a frame up.
785
        import pdb
786
        pdb.Pdb().set_trace(sys._getframe().f_back)
787
4063.1.3 by Robert Collins
Python2.4 compatibility.
788
    def exc_info(self):
789
        absent_attr = object()
790
        exc_info = getattr(self, '_exc_info', absent_attr)
791
        if exc_info is absent_attr:
792
            exc_info = getattr(self, '_TestCase__exc_info')
793
        return exc_info()
794
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
795
    def _check_leaked_threads(self):
796
        active = threading.activeCount()
797
        leaked_threads = active - TestCase._active_threads
798
        TestCase._active_threads = active
799
        if leaked_threads:
800
            TestCase._leaking_threads_tests += 1
801
            if TestCase._first_thread_leaker_id is None:
802
                TestCase._first_thread_leaker_id = self.id()
803
                # we're not specifically told when all tests are finished.
804
                # This will do. We use a function to avoid keeping a reference
805
                # to a TestCase object.
806
                atexit.register(_report_leaked_threads)
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
807
808
    def _clear_debug_flags(self):
809
        """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.
810
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
811
        Tests that want to use debug flags can just set them in the
812
        debug_flags set during setup/teardown.
813
        """
3731.3.1 by Andrew Bennetts
Make the test suite pass when -Eallow_debug is used.
814
        self._preserved_debug_flags = set(debug.debug_flags)
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
815
        if 'allow_debug' not in selftest_debug_flags:
3302.2.1 by Andrew Bennetts
Add -Dselftest_debug debug flag.
816
            debug.debug_flags.clear()
3731.3.1 by Andrew Bennetts
Make the test suite pass when -Eallow_debug is used.
817
        self.addCleanup(self._restore_debug_flags)
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
818
819
    def _clear_hooks(self):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
820
        # prevent hooks affecting tests
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.
821
        self._preserved_hooks = {}
822
        for key, factory in hooks.known_hooks.items():
823
            parent, name = hooks.known_hooks_key_to_parent_and_attribute(key)
824
            current_hooks = hooks.known_hooks_key_to_object(key)
825
            self._preserved_hooks[parent] = (name, current_hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
826
        self.addCleanup(self._restoreHooks)
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.
827
        for key, factory in hooks.known_hooks.items():
828
            parent, name = hooks.known_hooks_key_to_parent_and_attribute(key)
829
            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.
830
        # this hook should always be installed
831
        request._install_hook()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
832
2095.4.1 by Martin Pool
Better progress bars during tests
833
    def _silenceUI(self):
834
        """Turn off UI for duration of test"""
835
        # by default the UI is off; tests can turn it on if they want it.
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
836
        saved = ui.ui_factory
2095.4.1 by Martin Pool
Better progress bars during tests
837
        def _restore():
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
838
            ui.ui_factory = saved
839
        ui.ui_factory = ui.SilentUIFactory()
2095.4.1 by Martin Pool
Better progress bars during tests
840
        self.addCleanup(_restore)
841
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
842
    def _ndiff_strings(self, a, b):
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
843
        """Return ndiff between two strings containing lines.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
844
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
845
        A trailing newline is added if missing to make the strings
846
        print properly."""
847
        if b and b[-1] != '\n':
848
            b += '\n'
849
        if a and a[-1] != '\n':
850
            a += '\n'
1185.16.21 by Martin Pool
- tweak diff shown by assertEqualDiff
851
        difflines = difflib.ndiff(a.splitlines(True),
852
                                  b.splitlines(True),
853
                                  linejunk=lambda x: False,
854
                                  charjunk=lambda x: False)
855
        return ''.join(difflines)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
856
2255.2.190 by Martin Pool
assertEqual can take an option message
857
    def assertEqual(self, a, b, message=''):
2360.1.2 by John Arbash Meinel
Add an overzealous test, for Unicode support of _iter_changes.
858
        try:
859
            if a == b:
860
                return
861
        except UnicodeError, e:
862
            # If we can't compare without getting a UnicodeError, then
863
            # obviously they are different
864
            mutter('UnicodeError: %s', e)
2255.2.190 by Martin Pool
assertEqual can take an option message
865
        if message:
866
            message += '\n'
867
        raise AssertionError("%snot equal:\na = %s\nb = %s\n"
868
            % (message,
2477.1.4 by Martin Pool
fix up indenting in pformat of inequalities displayed by test suite
869
               pformat(a), pformat(b)))
2255.2.185 by Martin Pool
assertEqual uses pformat to show results
870
871
    assertEquals = assertEqual
872
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.
873
    def assertEqualDiff(self, a, b, message=None):
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
874
        """Assert two texts are equal, if not raise an exception.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
875
876
        This is intended for use with multi-line strings where it can
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
877
        be hard to find the differences by eye.
878
        """
879
        # TODO: perhaps override assertEquals to call this for strings?
880
        if a == b:
881
            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.
882
        if message is None:
883
            message = "texts not equal:\n"
3468.2.2 by Martin Pool
Better message re final newlines from assertEqualDiff
884
        if a == b + '\n':
885
            message = 'first string is missing a final newline.\n'
886
        if a + '\n' == b:
887
            message = 'second string is missing a final newline.\n'
2555.3.3 by Martin Pool
Simple lock tracing in LockDir
888
        raise AssertionError(message +
889
                             self._ndiff_strings(a, b))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
890
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.
891
    def assertEqualMode(self, mode, mode_test):
892
        self.assertEqual(mode, mode_test,
893
                         'mode mismatch %o != %o' % (mode, mode_test))
894
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
895
    def assertEqualStat(self, expected, actual):
896
        """assert that expected and actual are the same stat result.
897
898
        :param expected: A stat result.
899
        :param actual: A stat result.
900
        :raises AssertionError: If the expected and actual stat values differ
901
            other than by atime.
902
        """
903
        self.assertEqual(expected.st_size, actual.st_size)
904
        self.assertEqual(expected.st_mtime, actual.st_mtime)
905
        self.assertEqual(expected.st_ctime, actual.st_ctime)
906
        self.assertEqual(expected.st_dev, actual.st_dev)
907
        self.assertEqual(expected.st_ino, actual.st_ino)
908
        self.assertEqual(expected.st_mode, actual.st_mode)
909
4144.1.1 by Robert Collins
New assertLength method based on one Martin has squirreled away somewhere.
910
    def assertLength(self, length, obj_with_len):
911
        """Assert that obj_with_len is of length length."""
912
        if len(obj_with_len) != length:
913
            self.fail("Incorrect length: wanted %d, got %d for %r" % (
914
                length, len(obj_with_len), obj_with_len))
915
2474.1.68 by John Arbash Meinel
Review feedback from Martin, mostly documentation updates.
916
    def assertPositive(self, val):
917
        """Assert that val is greater than 0."""
918
        self.assertTrue(val > 0, 'expected a positive value, but got %s' % val)
919
920
    def assertNegative(self, val):
921
        """Assert that val is less than 0."""
922
        self.assertTrue(val < 0, 'expected a negative value, but got %s' % val)
923
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
924
    def assertStartsWith(self, s, prefix):
925
        if not s.startswith(prefix):
926
            raise AssertionError('string %r does not start with %r' % (s, prefix))
927
928
    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.
929
        """Asserts that s ends with suffix."""
930
        if not s.endswith(suffix):
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
931
            raise AssertionError('string %r does not end with %r' % (s, suffix))
1185.16.42 by Martin Pool
- Add assertContainsRe
932
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
933
    def assertContainsRe(self, haystack, needle_re, flags=0):
1185.16.42 by Martin Pool
- Add assertContainsRe
934
        """Assert that a contains something matching a regular expression."""
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
935
        if not re.search(needle_re, haystack, flags):
2555.3.1 by Martin Pool
Better messages from assertContainsRe
936
            if '\n' in haystack or len(haystack) > 60:
937
                # a long string, format it in a more readable way
938
                raise AssertionError(
939
                        'pattern "%s" not found in\n"""\\\n%s"""\n'
940
                        % (needle_re, haystack))
941
            else:
942
                raise AssertionError('pattern "%s" not found in "%s"'
943
                        % (needle_re, haystack))
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
944
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
945
    def assertNotContainsRe(self, haystack, needle_re, flags=0):
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
946
        """Assert that a does not match a regular expression"""
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
947
        if re.search(needle_re, haystack, flags):
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
948
            raise AssertionError('pattern "%s" found in "%s"'
949
                    % (needle_re, haystack))
950
1553.5.3 by Martin Pool
[patch] Rename TestCase.AssertSubset to assertSubset for consistency (Jan Hudec)
951
    def assertSubset(self, sublist, superlist):
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
952
        """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)
953
        missing = set(sublist) - set(superlist)
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
954
        if len(missing) > 0:
2695.1.4 by Martin Pool
Much faster assertSubset using sets, not O(n**2)
955
            raise AssertionError("value(s) %r not present in container %r" %
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
956
                                 (missing, superlist))
957
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
958
    def assertListRaises(self, excClass, func, *args, **kwargs):
959
        """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
960
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
961
        Many functions can return generators this makes sure
962
        to wrap them in a list() call to make sure the whole generator
963
        is run, and that the proper exception is raised.
964
        """
965
        try:
966
            list(func(*args, **kwargs))
3287.20.1 by John Arbash Meinel
Update assertListRaises so that it returns the exception.
967
        except excClass, e:
968
            return e
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
969
        else:
970
            if getattr(excClass,'__name__', None) is not None:
971
                excName = excClass.__name__
972
            else:
973
                excName = str(excClass)
974
            raise self.failureException, "%s not raised" % excName
975
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
976
    def assertRaises(self, excClass, callableObj, *args, **kwargs):
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
977
        """Assert that a callable raises a particular exception.
978
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
979
        :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.
980
            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.
981
        :param callableObj: A callable, will be passed ``*args`` and
982
            ``**kwargs``.
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
983
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
984
        Returns the exception so that you can examine it.
985
        """
986
        try:
2399.1.10 by John Arbash Meinel
fix assertRaises to use the right parameter...
987
            callableObj(*args, **kwargs)
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
988
        except excClass, e:
989
            return e
990
        else:
991
            if getattr(excClass,'__name__', None) is not None:
992
                excName = excClass.__name__
993
            else:
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
994
                # probably a tuple
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
995
                excName = str(excClass)
996
            raise self.failureException, "%s not raised" % excName
997
2220.1.13 by Marius Kruger
Remove assertNone
998
    def assertIs(self, left, right, message=None):
1185.68.1 by Aaron Bentley
test transactions
999
        if not (left is right):
2220.1.13 by Marius Kruger
Remove assertNone
1000
            if message is not None:
1001
                raise AssertionError(message)
1002
            else:
1003
                raise AssertionError("%r is not %r." % (left, right))
1004
1005
    def assertIsNot(self, left, right, message=None):
1006
        if (left is right):
1007
            if message is not None:
1008
                raise AssertionError(message)
1009
            else:
1010
                raise AssertionError("%r is %r." % (left, right))
2220.1.4 by Marius Kruger
* bzrlib/tests/__init__
1011
1530.1.21 by Robert Collins
Review feedback fixes.
1012
    def assertTransportMode(self, transport, path, mode):
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
1013
        """Fail if a path does not have mode mode.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1014
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
1015
        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.
1016
        """
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
1017
        if not transport._can_roundtrip_unix_modebits():
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
1018
            return
1019
        path_stat = transport.stat(path)
1020
        actual_mode = stat.S_IMODE(path_stat.st_mode)
3508.1.22 by Vincent Ladeuil
Fix python2.4 failures.
1021
        self.assertEqual(mode, actual_mode,
3508.1.15 by Vincent Ladeuil
Tweak chmod bits output for easier debug.
1022
                         'mode of %r incorrect (%s != %s)'
1023
                         % (path, oct(mode), oct(actual_mode)))
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
1024
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
1025
    def assertIsSameRealPath(self, path1, path2):
1026
        """Fail if path1 and path2 points to different files"""
2823.1.11 by Vincent Ladeuil
Review feedback.
1027
        self.assertEqual(osutils.realpath(path1),
1028
                         osutils.realpath(path2),
1029
                         "apparent paths:\na = %s\nb = %s\n," % (path1, path2))
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
1030
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1031
    def assertIsInstance(self, obj, kls):
1032
        """Fail if obj is not an instance of kls"""
1033
        if not isinstance(obj, kls):
1666.1.6 by Robert Collins
Make knit the default format.
1034
            self.fail("%r is an instance of %s rather than %s" % (
1035
                obj, obj.__class__, kls))
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1036
1551.13.10 by Aaron Bentley
Changes from review (poolie)
1037
    def expectFailure(self, reason, assertion, *args, **kwargs):
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1038
        """Invoke a test, expecting it to fail for the given reason.
1039
1551.13.10 by Aaron Bentley
Changes from review (poolie)
1040
        This is for assertions that ought to succeed, but currently fail.
1551.13.11 by Aaron Bentley
Update docs
1041
        (The failure is *expected* but not *wanted*.)  Please be very precise
1042
        about the failure you're expecting.  If a new bug is introduced,
1043
        AssertionError should be raised, not KnownFailure.
1044
1045
        Frequently, expectFailure should be followed by an opposite assertion.
1046
        See example below.
1551.13.10 by Aaron Bentley
Changes from review (poolie)
1047
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1048
        Intended to be used with a callable that raises AssertionError as the
1551.13.10 by Aaron Bentley
Changes from review (poolie)
1049
        'assertion' parameter.  args and kwargs are passed to the 'assertion'.
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1050
1051
        Raises KnownFailure if the test fails.  Raises AssertionError if the
1052
        test succeeds.
1053
1054
        example usage::
1551.13.11 by Aaron Bentley
Update docs
1055
1056
          self.expectFailure('Math is broken', self.assertNotEqual, 54,
1057
                             dynamic_val)
1058
          self.assertEqual(42, dynamic_val)
1059
1060
          This means that a dynamic_val of 54 will cause the test to raise
1061
          a KnownFailure.  Once math is fixed and the expectFailure is removed,
1062
          only a dynamic_val of 42 will allow the test to pass.  Anything other
1063
          than 54 or 42 will cause an AssertionError.
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1064
        """
1065
        try:
1551.13.10 by Aaron Bentley
Changes from review (poolie)
1066
            assertion(*args, **kwargs)
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1067
        except AssertionError:
1068
            raise KnownFailure(reason)
1069
        else:
1070
            self.fail('Unexpected success.  Should have failed: %s' % reason)
1071
3173.1.10 by Martin Pool
Move assertFileEqual to TestCase base class as it's generally usable
1072
    def assertFileEqual(self, content, path):
1073
        """Fail if path does not contain 'content'."""
1074
        self.failUnlessExists(path)
1075
        f = file(path, 'rb')
1076
        try:
1077
            s = f.read()
1078
        finally:
1079
            f.close()
1080
        self.assertEqualDiff(content, s)
1081
3173.1.12 by Martin Pool
Add test_push_log_file
1082
    def failUnlessExists(self, path):
1083
        """Fail unless path or paths, which may be abs or relative, exist."""
1084
        if not isinstance(path, basestring):
1085
            for p in path:
1086
                self.failUnlessExists(p)
1087
        else:
1088
            self.failUnless(osutils.lexists(path),path+" does not exist")
1089
1090
    def failIfExists(self, path):
1091
        """Fail if path or paths, which may be abs or relative, exist."""
1092
        if not isinstance(path, basestring):
1093
            for p in path:
1094
                self.failIfExists(p)
1095
        else:
1096
            self.failIf(osutils.lexists(path),path+" exists")
1097
2592.3.243 by Martin Pool
Rename TestCase._capture_warnings
1098
    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
1099
        """A helper for callDeprecated and applyDeprecated.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1100
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1101
        :param a_callable: A callable to call.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1102
        :param args: The positional arguments for the callable
1103
        :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
1104
        :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.
1105
            a_callable(``*args``, ``**kwargs``).
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1106
        """
1107
        local_warnings = []
2067.3.3 by Martin Pool
merge bzr.dev and reconcile several changes, also some test fixes
1108
        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
1109
            # we've hooked into a deprecation specific callpath,
1110
            # only deprecations should getting sent via it.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1111
            self.assertEqual(cls, DeprecationWarning)
1112
            local_warnings.append(msg)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1113
        original_warning_method = symbol_versioning.warn
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1114
        symbol_versioning.set_warning_method(capture_warnings)
1115
        try:
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1116
            result = a_callable(*args, **kwargs)
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1117
        finally:
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1118
            symbol_versioning.set_warning_method(original_warning_method)
1119
        return (local_warnings, result)
1120
1121
    def applyDeprecated(self, deprecation_format, a_callable, *args, **kwargs):
1122
        """Call a deprecated callable without warning the user.
1123
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1124
        Note that this only captures warnings raised by symbol_versioning.warn,
1125
        not other callers that go direct to the warning module.
1126
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1127
        To test that a deprecated method raises an error, do something like
1128
        this::
1129
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
1130
            self.assertRaises(errors.ReservedId,
1131
                self.applyDeprecated,
1132
                deprecated_in((1, 5, 0)),
1133
                br.append_revision,
1134
                'current:')
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1135
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1136
        :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.
1137
            should have been deprecated with. This is the same type as the
1138
            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
1139
            callable is not deprecated with this format, an assertion error
1140
            will be raised.
1141
        :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.
1142
            a regular function. It will be called with ``*args`` and
1143
            ``**kwargs``.
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1144
        :param args: The positional arguments for the callable
1145
        :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.
1146
        :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
1147
        """
2592.3.243 by Martin Pool
Rename TestCase._capture_warnings
1148
        call_warnings, result = self._capture_deprecation_warnings(a_callable,
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1149
            *args, **kwargs)
1150
        expected_first_warning = symbol_versioning.deprecation_string(
1151
            a_callable, deprecation_format)
1152
        if len(call_warnings) == 0:
2255.7.47 by Robert Collins
Improve applyDeprecated warning message.
1153
            self.fail("No deprecation warning generated by call to %s" %
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1154
                a_callable)
1155
        self.assertEqual(expected_first_warning, call_warnings[0])
1156
        return result
1157
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1158
    def callCatchWarnings(self, fn, *args, **kw):
1159
        """Call a callable that raises python warnings.
1160
1161
        The caller's responsible for examining the returned warnings.
1162
1163
        If the callable raises an exception, the exception is not
1164
        caught and propagates up to the caller.  In that case, the list
1165
        of warnings is not available.
1166
1167
        :returns: ([warning_object, ...], fn_result)
1168
        """
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1169
        # XXX: This is not perfect, because it completely overrides the
1170
        # warnings filters, and some code may depend on suppressing particular
1171
        # warnings.  It's the easiest way to insulate ourselves from -Werror,
1172
        # though.  -- Andrew, 20071062
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1173
        wlist = []
3734.5.3 by Vincent Ladeuil
Martin's review feedback.
1174
        def _catcher(message, category, filename, lineno, file=None, line=None):
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1175
            # despite the name, 'message' is normally(?) a Warning subclass
1176
            # instance
1177
            wlist.append(message)
1178
        saved_showwarning = warnings.showwarning
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1179
        saved_filters = warnings.filters
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1180
        try:
1181
            warnings.showwarning = _catcher
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1182
            warnings.filters = []
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1183
            result = fn(*args, **kw)
1184
        finally:
1185
            warnings.showwarning = saved_showwarning
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1186
            warnings.filters = saved_filters
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1187
        return wlist, result
1188
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1189
    def callDeprecated(self, expected, callable, *args, **kwargs):
1190
        """Assert that a callable is deprecated in a particular way.
1191
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1192
        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
1193
        applyDeprecated helper function is probably more suited for most tests
1194
        as it allows you to simply specify the deprecation format being used
1195
        and will ensure that that is issued for the function being called.
1196
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1197
        Note that this only captures warnings raised by symbol_versioning.warn,
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1198
        not other callers that go direct to the warning module.  To catch
1199
        general warnings, use callCatchWarnings.
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1200
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1201
        :param expected: a list of the deprecation warnings expected, in order
1202
        :param callable: The callable to call
1203
        :param args: The positional arguments for the callable
1204
        :param kwargs: The keyword arguments for the callable
1205
        """
2592.3.243 by Martin Pool
Rename TestCase._capture_warnings
1206
        call_warnings, result = self._capture_deprecation_warnings(callable,
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1207
            *args, **kwargs)
1208
        self.assertEqual(expected, call_warnings)
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1209
        return result
1210
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1211
    def _startLogFile(self):
1212
        """Send bzr and test log messages to a temporary file.
1213
1214
        The file is removed as the test is torn down.
1215
        """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1216
        fileno, name = tempfile.mkstemp(suffix='.log', prefix='testbzr')
1948.1.9 by John Arbash Meinel
Change mutter() so that it doesn't try so hard to write out perfect utf8, instead, rather than using a utf8 file, it changes unicode to utf8 manually
1217
        self._log_file = os.fdopen(fileno, 'w+')
3173.1.9 by Martin Pool
tests should now call push/pop_test_log
1218
        self._log_memento = bzrlib.trace.push_log_file(self._log_file)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1219
        self._log_file_name = name
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1220
        self.addCleanup(self._finishLogFile)
1221
1222
    def _finishLogFile(self):
1223
        """Finished with the log file.
1224
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1225
        Close the file and delete it, unless setKeepLogfile was called.
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1226
        """
1711.7.10 by John Arbash Meinel
Nothing to clean up if self._log_file is None
1227
        if self._log_file is None:
1228
            return
3173.1.9 by Martin Pool
tests should now call push/pop_test_log
1229
        bzrlib.trace.pop_log_file(self._log_memento)
1185.16.122 by Martin Pool
[patch] Close test log file before deleting, needed on Windows
1230
        self._log_file.close()
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1231
        self._log_file = None
2024.2.9 by John Arbash Meinel
Bring back log deletions
1232
        if not self._keep_log_file:
1233
            os.remove(self._log_file_name)
1234
            self._log_file_name = None
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1235
1236
    def setKeepLogfile(self):
1237
        """Make the logfile not be deleted when _finishLogFile is called."""
1238
        self._keep_log_file = True
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1239
3620.1.1 by Jonathan Lange
Let addCleanup take arguments that are then passed to the cleanup.
1240
    def addCleanup(self, callable, *args, **kwargs):
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1241
        """Arrange to run a callable when this case is torn down.
1242
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1243
        Callables are run in the reverse of the order they are registered,
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1244
        ie last-in first-out.
1245
        """
3620.1.1 by Jonathan Lange
Let addCleanup take arguments that are then passed to the cleanup.
1246
        self._cleanups.append((callable, args, kwargs))
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1247
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1248
    def _cleanEnvironment(self):
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1249
        new_env = {
2055.1.2 by John Arbash Meinel
Clean up BZR_HOME in ENV for the test suite
1250
            'BZR_HOME': None, # Don't inherit BZR_HOME to all the tests.
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1251
            'HOME': os.getcwd(),
3638.4.4 by Mark Hammond
fix typo in comments
1252
            # bzr now uses the Win32 API and doesn't rely on APPDATA, but the
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
1253
            # tests do check our impls match APPDATA
2839.6.2 by Alexander Belchenko
changes after Martin's review
1254
            'BZR_EDITOR': None, # test_msgeditor manipulates this variable
4183.4.1 by Vincent Ladeuil
Fix bug #347130 by properly isolating test_msgeditor.MsgEditorTest tests.
1255
            'VISUAL': None,
1256
            'EDITOR': None,
1861.4.1 by Matthieu Moy
BZREMAIL renamed to BZR_EMAIL.
1257
            'BZR_EMAIL': None,
1912.2.1 by Adeodato Simó
Clear $BZREMAIL in tests, not only the newer $BZR_EMAIL, since the
1258
            'BZREMAIL': None, # may still be present in the environment
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1259
            'EMAIL': None,
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1260
            'BZR_PROGRESS_BAR': None,
3193.6.1 by Alexander Belchenko
``BZR_LOG=disable`` suppresses writing messages to .bzr.log.
1261
            'BZR_LOG': None,
3835.2.7 by Aaron Bentley
Add tests for plugins
1262
            'BZR_PLUGIN_PATH': None,
2617.2.1 by Jelmer Vernooij
Sanitize SSH_AUTH_SOCK environment variable (#125955).
1263
            # SSH Agent
1264
            'SSH_AUTH_SOCK': None,
2167.3.6 by v.ladeuil+lp at free
Take John's comments into account and add more tests.
1265
            # Proxies
1266
            'http_proxy': None,
1267
            'HTTP_PROXY': None,
1268
            'https_proxy': None,
1269
            'HTTPS_PROXY': None,
1270
            'no_proxy': None,
1271
            'NO_PROXY': None,
1272
            'all_proxy': None,
1273
            'ALL_PROXY': None,
1274
            # Nobody cares about these ones AFAIK. So far at
1275
            # least. If you do (care), please update this comment
1276
            # -- vila 20061212
1277
            'ftp_proxy': None,
1278
            'FTP_PROXY': None,
2512.3.1 by Daniel Watkins
Added BZR_REMOTE_PATH to the list of environment variables cleaned before running tests, fixing bug #111958.
1279
            'BZR_REMOTE_PATH': None,
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1280
        }
1185.38.4 by John Arbash Meinel
Making old_env a private member
1281
        self.__old_env = {}
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1282
        self.addCleanup(self._restoreEnvironment)
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1283
        for name, value in new_env.iteritems():
1284
            self._captureVar(name, value)
1285
1286
    def _captureVar(self, name, newvalue):
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1287
        """Set an environment variable, and reset it when finished."""
1288
        self.__old_env[name] = osutils.set_or_unset_env(name, newvalue)
1185.38.2 by John Arbash Meinel
[patch] Aaron Bentley's HOME fix.
1289
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1290
    def _restore_debug_flags(self):
2560.1.3 by Robert Collins
Allow 'from debug import debug_flags'
1291
        debug.debug_flags.clear()
1292
        debug.debug_flags.update(self._preserved_debug_flags)
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1293
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1294
    def _restoreEnvironment(self):
1185.38.4 by John Arbash Meinel
Making old_env a private member
1295
        for name, value in self.__old_env.iteritems():
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1296
            osutils.set_or_unset_env(name, value)
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1297
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1298
    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.
1299
        for klass, (name, hooks) in self._preserved_hooks.items():
1300
            setattr(klass, name, hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1301
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1302
    def knownFailure(self, reason):
1303
        """This test has failed for some known reason."""
1304
        raise KnownFailure(reason)
1305
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1306
    def _do_skip(self, result, reason):
1307
        addSkip = getattr(result, 'addSkip', None)
1308
        if not callable(addSkip):
4063.1.3 by Robert Collins
Python2.4 compatibility.
1309
            result.addError(self, self.exc_info())
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1310
        else:
1311
            addSkip(self, reason)
1312
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1313
    def run(self, result=None):
1314
        if result is None: result = self.defaultTestResult()
1315
        for feature in getattr(self, '_test_needs_features', []):
1316
            if not feature.available():
1317
                result.startTest(self)
1318
                if getattr(result, 'addNotSupported', None):
1319
                    result.addNotSupported(self, feature)
1320
                else:
1321
                    result.addSuccess(self)
1322
                result.stopTest(self)
1323
                return
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1324
        try:
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1325
            try:
1326
                result.startTest(self)
4063.1.3 by Robert Collins
Python2.4 compatibility.
1327
                absent_attr = object()
1328
                # Python 2.5
1329
                method_name = getattr(self, '_testMethodName', absent_attr)
1330
                if method_name is absent_attr:
1331
                    # Python 2.4
1332
                    method_name = getattr(self, '_TestCase__testMethodName')
1333
                testMethod = getattr(self, method_name)
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1334
                try:
1335
                    try:
1336
                        self.setUp()
4153.1.1 by Andrew Bennetts
Check that TestCase.setUp was called in TestCase.run. If not, fail the test.
1337
                        if not self._bzr_test_setUp_run:
1338
                            self.fail(
1339
                                "test setUp did not invoke "
1340
                                "bzrlib.tests.TestCase's setUp")
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1341
                    except KeyboardInterrupt:
1342
                        raise
1343
                    except TestSkipped, e:
1344
                        self._do_skip(result, e.args[0])
1345
                        self.tearDown()
1346
                        return
1347
                    except:
4063.1.3 by Robert Collins
Python2.4 compatibility.
1348
                        result.addError(self, self.exc_info())
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1349
                        return
1350
1351
                    ok = False
1352
                    try:
1353
                        testMethod()
1354
                        ok = True
1355
                    except self.failureException:
4063.1.3 by Robert Collins
Python2.4 compatibility.
1356
                        result.addFailure(self, self.exc_info())
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1357
                    except TestSkipped, e:
1358
                        if not e.args:
1359
                            reason = "No reason given."
1360
                        else:
1361
                            reason = e.args[0]
1362
                        self._do_skip(result, reason)
1363
                    except KeyboardInterrupt:
1364
                        raise
1365
                    except:
4063.1.3 by Robert Collins
Python2.4 compatibility.
1366
                        result.addError(self, self.exc_info())
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1367
1368
                    try:
1369
                        self.tearDown()
4153.1.3 by Andrew Bennetts
Check that bzrlib.tests.TestCase.tearDown is called too.
1370
                        if not self._bzr_test_tearDown_run:
1371
                            self.fail(
1372
                                "test tearDown did not invoke "
1373
                                "bzrlib.tests.TestCase's tearDown")
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1374
                    except KeyboardInterrupt:
1375
                        raise
1376
                    except:
4063.1.3 by Robert Collins
Python2.4 compatibility.
1377
                        result.addError(self, self.exc_info())
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1378
                        ok = False
1379
                    if ok: result.addSuccess(self)
1380
                finally:
1381
                    result.stopTest(self)
1382
                return
1383
            except TestNotApplicable:
1384
                # Not moved from the result [yet].
1385
                raise
1386
            except KeyboardInterrupt:
1387
                raise
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1388
        finally:
1389
            saved_attrs = {}
3224.4.3 by Andrew Bennetts
Rename 'not_found' marker to 'absent_attr'.
1390
            absent_attr = object()
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1391
            for attr_name in self.attrs_to_keep:
3224.4.3 by Andrew Bennetts
Rename 'not_found' marker to 'absent_attr'.
1392
                attr = getattr(self, attr_name, absent_attr)
1393
                if attr is not absent_attr:
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1394
                    saved_attrs[attr_name] = attr
1395
            self.__dict__ = saved_attrs
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1396
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1397
    def tearDown(self):
4153.1.3 by Andrew Bennetts
Check that bzrlib.tests.TestCase.tearDown is called too.
1398
        self._bzr_test_tearDown_run = True
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1399
        self._runCleanups()
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1400
        self._log_contents = ''
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1401
        unittest.TestCase.tearDown(self)
1402
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)
1403
    def time(self, callable, *args, **kwargs):
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1404
        """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
1405
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1406
        If lsprofiling is enabled (i.e. by --lsprof-time to bzr selftest) then
1407
        this will cause lsprofile statistics to be gathered and stored in
1408
        self._benchcalls.
1409
        """
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)
1410
        if self._benchtime is None:
1411
            self._benchtime = 0
1412
        start = time.time()
1413
        try:
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1414
            if not self._gather_lsprof_in_benchmarks:
1415
                return callable(*args, **kwargs)
1416
            else:
1417
                # record this benchmark
1418
                ret, stats = bzrlib.lsprof.profile(callable, *args, **kwargs)
1419
                stats.sort()
1420
                self._benchcalls.append(((callable, args, kwargs), stats))
1421
                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)
1422
        finally:
1423
            self._benchtime += time.time() - start
1424
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1425
    def _runCleanups(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1426
        """Run registered cleanup functions.
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1427
1428
        This should only be called from TestCase.tearDown.
1429
        """
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1430
        # TODO: Perhaps this should keep running cleanups even if
1541 by Martin Pool
doc
1431
        # one of them fails?
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1432
1433
        # Actually pop the cleanups from the list so tearDown running
1434
        # twice is safe (this happens for skipped tests).
1435
        while self._cleanups:
3620.1.1 by Jonathan Lange
Let addCleanup take arguments that are then passed to the cleanup.
1436
            cleanup, args, kwargs = self._cleanups.pop()
1437
            cleanup(*args, **kwargs)
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1438
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1439
    def log(self, *args):
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
1440
        mutter(*args)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1441
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1442
    def _get_log(self, keep_log_file=False):
2725.1.1 by Robert Collins
Add -Devil flag to highlight the use of problematic API calls.
1443
        """Get the log from bzrlib.trace calls from this test.
1444
1445
        :param keep_log_file: When True, if the log is still a file on disk
1446
            leave it as a file on disk. When False, if the log is still a file
1447
            on disk, the log file is deleted and the log preserved as
1448
            self._log_contents.
1449
        :return: A string containing the log.
1450
        """
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1451
        # flush the log file, to get all content
1452
        import bzrlib.trace
3778.4.1 by Martin Pool
test _get_log method should cope if .bzr.log is not open
1453
        if bzrlib.trace._trace_file:
1454
            bzrlib.trace._trace_file.flush()
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1455
        if self._log_contents:
3199.1.1 by Vincent Ladeuil
Get rid of ~1000 useless log files out of 10.000 tests in /tmp.
1456
            # XXX: this can hardly contain the content flushed above --vila
1457
            # 20080128
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1458
            return self._log_contents
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1459
        if self._log_file_name is not None:
1460
            logfile = open(self._log_file_name)
1461
            try:
1462
                log_contents = logfile.read()
1463
            finally:
1464
                logfile.close()
1465
            if not keep_log_file:
1466
                self._log_contents = log_contents
2309.2.7 by Alexander Belchenko
Skip permission denied (on win32) during selftest cleanup
1467
                try:
1468
                    os.remove(self._log_file_name)
1469
                except OSError, e:
1470
                    if sys.platform == 'win32' and e.errno == errno.EACCES:
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
1471
                        sys.stderr.write(('Unable to delete log file '
1472
                                             ' %r\n' % self._log_file_name))
2309.2.7 by Alexander Belchenko
Skip permission denied (on win32) during selftest cleanup
1473
                    else:
1474
                        raise
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1475
            return log_contents
1476
        else:
1477
            return "DELETED log file to reduce memory footprint"
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1478
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1479
    def requireFeature(self, feature):
1480
        """This test requires a specific feature is available.
1481
1482
        :raises UnavailableFeature: When feature is not available.
1483
        """
1484
        if not feature.available():
1485
            raise UnavailableFeature(feature)
1486
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1487
    def _run_bzr_autosplit(self, args, retcode, encoding, stdin,
1488
            working_dir):
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1489
        """Run bazaar command line, splitting up a string command line."""
1490
        if isinstance(args, basestring):
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
1491
            # shlex don't understand unicode strings,
1492
            # so args should be plain string (bialix 20070906)
1493
            args = list(shlex.split(str(args)))
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1494
        return self._run_bzr_core(args, retcode=retcode,
1495
                encoding=encoding, stdin=stdin, working_dir=working_dir,
1496
                )
1497
1498
    def _run_bzr_core(self, args, retcode, encoding, stdin,
1499
            working_dir):
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
1500
        if encoding is None:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
1501
            encoding = osutils.get_user_encoding()
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
1502
        stdout = StringIOWrapper()
1503
        stderr = StringIOWrapper()
1504
        stdout.encoding = encoding
1505
        stderr.encoding = encoding
1506
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1507
        self.log('run bzr: %r', args)
1185.43.5 by Martin Pool
Update log message quoting
1508
        # FIXME: don't call into logging here
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1509
        handler = logging.StreamHandler(stderr)
1510
        handler.setLevel(logging.INFO)
1511
        logger = logging.getLogger('')
1512
        logger.addHandler(handler)
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
1513
        old_ui_factory = ui.ui_factory
1514
        ui.ui_factory = TestUIFactory(stdin=stdin, stdout=stdout, stderr=stderr)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1515
1516
        cwd = None
1517
        if working_dir is not None:
1518
            cwd = osutils.getcwd()
1519
            os.chdir(working_dir)
1520
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1521
        try:
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1522
            result = self.apply_redirected(ui.ui_factory.stdin,
1523
                stdout, stderr,
2830.2.1 by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite
1524
                bzrlib.commands.run_bzr_catch_user_errors,
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1525
                args)
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1526
        finally:
1527
            logger.removeHandler(handler)
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
1528
            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
1529
            if cwd is not None:
1530
                os.chdir(cwd)
1685.1.69 by Wouter van Heyst
merge bzr.dev 1740
1531
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1532
        out = stdout.getvalue()
1533
        err = stderr.getvalue()
1534
        if out:
1185.85.72 by John Arbash Meinel
Fix some of the tests.
1535
            self.log('output:\n%r', out)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1536
        if err:
1185.85.72 by John Arbash Meinel
Fix some of the tests.
1537
            self.log('errors:\n%r', err)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1538
        if retcode is not None:
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
1539
            self.assertEquals(retcode, result,
1540
                              message='Unexpected return code')
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1541
        return out, err
1542
2830.2.5 by Martin Pool
Deprecated ``run_bzr_decode``; use the new ``output_encoding`` parameter to
1543
    def run_bzr(self, args, retcode=0, encoding=None, stdin=None,
1544
                working_dir=None, error_regexes=[], output_encoding=None):
1119 by Martin Pool
doc
1545
        """Invoke bzr, as if it were run from the command line.
1546
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1547
        The argument list should not include the bzr program name - the
1548
        first argument is normally the bzr command.  Arguments may be
1549
        passed in three ways:
1550
1551
        1- A list of strings, eg ["commit", "a"].  This is recommended
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1552
        when the command contains whitespace or metacharacters, or
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1553
        is built up at run time.
1554
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1555
        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.
1556
        for hardcoded commands.
1557
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
1558
        This runs bzr through the interface that catches and reports
1559
        errors, and with logging set to something approximating the
1560
        default, so that error reporting can be checked.
1561
1119 by Martin Pool
doc
1562
        This should be the main method for tests that want to exercise the
1563
        overall behavior of the bzr application (rather than a unit test
1564
        or a functional test of the library.)
1565
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1566
        This sends the stdout/stderr results into the test's log,
1567
        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.
1568
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1569
        :keyword stdin: A string to be used as stdin for the command.
2399.1.17 by John Arbash Meinel
[merge] bzr.dev 2562
1570
        :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.
1571
            default 0.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1572
        :keyword working_dir: The directory to run the command in
2399.1.17 by John Arbash Meinel
[merge] bzr.dev 2562
1573
        :keyword error_regexes: A list of expected error messages.  If
1574
            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
1575
        """
2830.2.5 by Martin Pool
Deprecated ``run_bzr_decode``; use the new ``output_encoding`` parameter to
1576
        out, err = self._run_bzr_autosplit(
1577
            args=args,
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1578
            retcode=retcode,
2830.2.5 by Martin Pool
Deprecated ``run_bzr_decode``; use the new ``output_encoding`` parameter to
1579
            encoding=encoding,
1580
            stdin=stdin,
1581
            working_dir=working_dir,
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1582
            )
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
1583
        for regex in error_regexes:
1584
            self.assertContainsRe(err, regex)
1585
        return out, err
1586
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.
1587
    def run_bzr_error(self, error_regexes, *args, **kwargs):
1711.2.71 by John Arbash Meinel
Default to retcode=3, and add a test for run_bzr_error
1588
        """Run bzr, 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.
1589
1590
        :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.
1591
            must each be found in the error output. The relative ordering
1592
            is not enforced.
1593
        :param args: command-line arguments for bzr
1594
        :param kwargs: Keyword arguments which are interpreted by run_bzr
1595
            This function changes the default value of retcode to be 3,
1596
            since in most cases this is run when you expect bzr to fail.
2581.1.1 by Martin Pool
Merge more runbzr cleanups
1597
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1598
        :return: (out, err) The actual output of running the command (in case
1599
            you want to do more inspection)
1600
1601
        Examples of use::
1602
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
1603
            # Make sure that commit is failing because there is nothing to do
1604
            self.run_bzr_error(['no changes to commit'],
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
1605
                               ['commit', '-m', 'my commit comment'])
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
1606
            # Make sure --strict is handling an unknown file, rather than
1607
            # giving us the 'nothing to do' error
1608
            self.build_tree(['unknown'])
1609
            self.run_bzr_error(['Commit refused because there are unknown files'],
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
1610
                               ['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
1611
        """
1612
        kwargs.setdefault('retcode', 3)
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
1613
        kwargs['error_regexes'] = error_regexes
1614
        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
1615
        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.
1616
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1617
    def run_bzr_subprocess(self, *args, **kwargs):
1618
        """Run bzr in a subprocess for testing.
1619
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1620
        This starts a new Python interpreter and runs bzr in there.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1621
        This should only be used for tests that have a justifiable need for
1622
        this isolation: e.g. they are testing startup time, or signal
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1623
        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
1624
        profiled or debugged so easily.
1752.1.7 by Aaron Bentley
Stop using shlex in run_bzr_subprocess
1625
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1626
        :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
1627
            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.
1628
        :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
1629
            variables. A value of None will unset the env variable.
1630
            The values must be strings. The change will only occur in the
1631
            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.
1632
        :keyword universal_newlines: Convert CRLF => LF
1633
        :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.
1634
            --no-plugins to ensure test reproducibility. Also, it is possible
2067.2.2 by John Arbash Meinel
Review comments from Robert
1635
            for system-wide plugins to create unexpected output on stderr,
1636
            which can cause unnecessary test failures.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1637
        """
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
1638
        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
1639
        working_dir = kwargs.get('working_dir', None)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1640
        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
1641
        if len(args) == 1:
1642
            if isinstance(args[0], list):
1643
                args = args[0]
1644
            elif isinstance(args[0], basestring):
1645
                args = list(shlex.split(args[0]))
1646
        else:
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
1647
            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
1648
        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.
1649
                                            working_dir=working_dir,
1650
                                            allow_plugins=allow_plugins)
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1651
        # We distinguish between retcode=None and retcode not passed.
1652
        supplied_retcode = kwargs.get('retcode', 0)
1653
        return self.finish_bzr_subprocess(process, retcode=supplied_retcode,
1654
            universal_newlines=kwargs.get('universal_newlines', False),
1655
            process_args=args)
1656
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
1657
    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
1658
                             skip_if_plan_to_signal=False,
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1659
                             working_dir=None,
1660
                             allow_plugins=False):
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1661
        """Start bzr in a subprocess for testing.
1662
1663
        This starts a new Python interpreter and runs bzr in there.
1664
        This should only be used for tests that have a justifiable need for
1665
        this isolation: e.g. they are testing startup time, or signal
1666
        handling, or early startup code, etc.  Subprocess code can't be
1667
        profiled or debugged so easily.
1668
1669
        :param process_args: a list of arguments to pass to the bzr executable,
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
1670
            for example ``['--version']``.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1671
        :param env_changes: A dictionary which lists changes to environment
1672
            variables. A value of None will unset the env variable.
1673
            The values must be strings. The change will only occur in the
1674
            child, so you don't need to fix the environment after running.
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
1675
        :param skip_if_plan_to_signal: raise TestSkipped when true and os.kill
1676
            is not available.
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1677
        :param allow_plugins: If False (default) pass --no-plugins to bzr.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1678
1679
        :returns: Popen object for the started process.
1680
        """
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
1681
        if skip_if_plan_to_signal:
1682
            if not getattr(os, 'kill', None):
1683
                raise TestSkipped("os.kill not available.")
1684
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1685
        if env_changes is None:
1686
            env_changes = {}
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1687
        old_env = {}
1688
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
1689
        def cleanup_environment():
1690
            for env_var, value in env_changes.iteritems():
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1691
                old_env[env_var] = osutils.set_or_unset_env(env_var, value)
1692
1693
        def restore_environment():
1694
            for env_var, value in old_env.iteritems():
1695
                osutils.set_or_unset_env(env_var, value)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
1696
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
1697
        bzr_path = self.get_bzr_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
1698
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1699
        cwd = None
1700
        if working_dir is not None:
1701
            cwd = osutils.getcwd()
1702
            os.chdir(working_dir)
1703
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1704
        try:
1705
            # win32 subprocess doesn't support preexec_fn
1706
            # so we will avoid using it on all platforms, just to
1707
            # make sure the code path is used, and we don't break on win32
1708
            cleanup_environment()
3616.2.1 by Mark Hammond
Fix how blackbox tests start bzr from frozen executables.
1709
            command = [sys.executable]
1710
            # frozen executables don't need the path to bzr
3616.2.7 by Mark Hammond
prefer getattr() over hasattr()
1711
            if getattr(sys, "frozen", None) is None:
3616.2.1 by Mark Hammond
Fix how blackbox tests start bzr from frozen executables.
1712
                command.append(bzr_path)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1713
            if not allow_plugins:
1714
                command.append('--no-plugins')
1715
            command.extend(process_args)
1716
            process = self._popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1717
        finally:
1718
            restore_environment()
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1719
            if cwd is not None:
1720
                os.chdir(cwd)
1721
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
1722
        return process
1723
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1724
    def _popen(self, *args, **kwargs):
1725
        """Place a call to Popen.
2067.2.2 by John Arbash Meinel
Review comments from Robert
1726
1727
        Allows tests to override this method to intercept the calls made to
1728
        Popen for introspection.
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1729
        """
1730
        return Popen(*args, **kwargs)
1731
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
1732
    def get_bzr_path(self):
2018.1.9 by Andrew Bennetts
Implement ParamikoVendor.connect_ssh
1733
        """Return the path of the 'bzr' executable for this test suite."""
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
1734
        bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
1735
        if not os.path.isfile(bzr_path):
1736
            # We are probably installed. Assume sys.argv is the right file
1737
            bzr_path = sys.argv[0]
1738
        return bzr_path
1739
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1740
    def finish_bzr_subprocess(self, process, retcode=0, send_signal=None,
1741
                              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
1742
        """Finish the execution of process.
1743
1744
        :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.
1745
        :param retcode: The status code that is expected.  Defaults to 0.  If
1746
            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
1747
        :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.
1748
        :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
1749
        :returns: (stdout, stderr)
1750
        """
1751
        if send_signal is not None:
1752
            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.
1753
        out, err = process.communicate()
1754
1755
        if universal_newlines:
1756
            out = out.replace('\r\n', '\n')
1757
            err = err.replace('\r\n', '\n')
1758
1759
        if retcode is not None and retcode != process.returncode:
1760
            if process_args is None:
1761
                process_args = "(unknown args)"
1762
            mutter('Output of bzr %s:\n%s', process_args, out)
1763
            mutter('Error for bzr %s:\n%s', process_args, err)
1764
            self.fail('Command bzr %s failed with retcode %s != %s'
1765
                      % (process_args, retcode, process.returncode))
1766
        return [out, err]
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
1767
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1768
    def check_inventory_shape(self, inv, shape):
1291 by Martin Pool
- add test for moving files between directories
1769
        """Compare an inventory to a list of expected names.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1770
1771
        Fail if they are not precisely equal.
1772
        """
1773
        extras = []
1774
        shape = list(shape)             # copy
1775
        for path, ie in inv.entries():
1776
            name = path.replace('\\', '/')
2545.3.1 by James Westby
Fix detection of directory entries in the inventory.
1777
            if ie.kind == 'directory':
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1778
                name = name + '/'
1779
            if name in shape:
1780
                shape.remove(name)
1781
            else:
1782
                extras.append(name)
1783
        if shape:
1784
            self.fail("expected paths not found in inventory: %r" % shape)
1785
        if extras:
1786
            self.fail("unexpected paths found in inventory: %r" % extras)
1787
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1788
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
1789
                         a_callable=None, *args, **kwargs):
1790
        """Call callable with redirected std io pipes.
1791
1792
        Returns the return code."""
1793
        if not callable(a_callable):
1794
            raise ValueError("a_callable must be callable.")
1795
        if stdin is None:
1796
            stdin = StringIO("")
1797
        if stdout is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
1798
            if getattr(self, "_log_file", None) is not None:
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
1799
                stdout = self._log_file
1800
            else:
1801
                stdout = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1802
        if stderr is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
1803
            if getattr(self, "_log_file", None is not None):
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
1804
                stderr = self._log_file
1805
            else:
1806
                stderr = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1807
        real_stdin = sys.stdin
1808
        real_stdout = sys.stdout
1809
        real_stderr = sys.stderr
1810
        try:
1811
            sys.stdout = stdout
1812
            sys.stderr = stderr
1813
            sys.stdin = stdin
1160 by Martin Pool
- tiny refactoring
1814
            return a_callable(*args, **kwargs)
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1815
        finally:
1816
            sys.stdout = real_stdout
1817
            sys.stderr = real_stderr
1818
            sys.stdin = real_stdin
1819
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1820
    def reduceLockdirTimeout(self):
1821
        """Reduce the default lock timeout for the duration of the test, so that
1822
        if LockContention occurs during a test, it does so quickly.
1823
1824
        Tests that expect to provoke LockContention errors should call this.
1825
        """
1826
        orig_timeout = bzrlib.lockdir._DEFAULT_TIMEOUT_SECONDS
1827
        def resetTimeout():
1828
            bzrlib.lockdir._DEFAULT_TIMEOUT_SECONDS = orig_timeout
1829
        self.addCleanup(resetTimeout)
1830
        bzrlib.lockdir._DEFAULT_TIMEOUT_SECONDS = 0
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1831
2717.1.1 by Lukáš Lalinsky
Use UTF-8 encoded StringIO for log tests to avoid failures on non-ASCII committer names.
1832
    def make_utf8_encoded_stringio(self, encoding_type=None):
1833
        """Return a StringIOWrapper instance, that will encode Unicode
1834
        input to UTF-8.
1835
        """
1836
        if encoding_type is None:
1837
            encoding_type = 'strict'
1838
        sio = StringIO()
1839
        output_encoding = 'utf-8'
1840
        sio = codecs.getwriter(output_encoding)(sio, errors=encoding_type)
1841
        sio.encoding = output_encoding
1842
        return sio
1843
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1844
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.
1845
class CapturedCall(object):
1846
    """A helper for capturing smart server calls for easy debug analysis."""
1847
1848
    def __init__(self, params, prefix_length):
1849
        """Capture the call with params and skip prefix_length stack frames."""
1850
        self.call = params
1851
        import traceback
1852
        # The last 5 frames are the __init__, the hook frame, and 3 smart
1853
        # client frames. Beyond this we could get more clever, but this is good
1854
        # enough for now.
1855
        stack = traceback.extract_stack()[prefix_length:-5]
1856
        self.stack = ''.join(traceback.format_list(stack))
1857
1858
    def __str__(self):
1859
        return self.call.method
1860
1861
    def __repr__(self):
1862
        return self.call.method
1863
1864
    def stack(self):
1865
        return self.stack
1866
1867
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1868
class TestCaseWithMemoryTransport(TestCase):
1869
    """Common test class for tests that do not need disk resources.
1870
1871
    Tests that need disk resources should derive from TestCaseWithTransport.
1872
1873
    TestCaseWithMemoryTransport sets the TEST_ROOT variable for all bzr tests.
1874
1875
    For TestCaseWithMemoryTransport the test_home_dir is set to the name of
1876
    a directory which does not exist. This serves to help ensure test isolation
1877
    is preserved. test_dir is set to the TEST_ROOT, as is cwd, because they
1878
    must exist. However, TestCaseWithMemoryTransport does not offer local
1879
    file defaults for the transport in tests, nor does it obey the command line
1880
    override, so tests that accidentally write to the common directory should
1881
    be rare.
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
1882
1883
    :cvar TEST_ROOT: Directory containing all temporary directories, plus
1884
    a .bzr directory that stops us ascending higher into the filesystem.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1885
    """
1886
1887
    TEST_ROOT = None
1888
    _TEST_NAME = 'test'
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1889
1986.2.5 by Robert Collins
Unbreak transport tests.
1890
    def __init__(self, methodName='runTest'):
3128.1.3 by Vincent Ladeuil
Since we are there s/parameteris.*/parameteriz&/.
1891
        # allow test parameterization after test construction and before test
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1892
        # execution. Variables that the parameterizer sets need to be
1986.2.5 by Robert Collins
Unbreak transport tests.
1893
        # ones that are not set by setUp, or setUp will trash them.
1894
        super(TestCaseWithMemoryTransport, self).__init__(methodName)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1895
        self.vfs_transport_factory = default_transport
1896
        self.transport_server = None
1986.2.5 by Robert Collins
Unbreak transport tests.
1897
        self.transport_readonly_server = None
2018.5.44 by Andrew Bennetts
Small changes to help a couple more tests pass.
1898
        self.__vfs_server = None
1986.2.5 by Robert Collins
Unbreak transport tests.
1899
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1900
    def get_transport(self, relpath=None):
1901
        """Return a writeable transport.
1902
1903
        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.
1904
        "self._test_root"
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1905
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1906
        :param relpath: a path relative to the base url.
1907
        """
1908
        t = get_transport(self.get_url(relpath))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1909
        self.assertFalse(t.is_readonly())
1910
        return t
1911
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1912
    def get_readonly_transport(self, relpath=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1913
        """Return a readonly transport for the test scratch space
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1914
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1915
        This can be used to test that operations which should only need
1916
        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.
1917
1918
        :param relpath: a path relative to the base url.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1919
        """
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1920
        t = get_transport(self.get_readonly_url(relpath))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1921
        self.assertTrue(t.is_readonly())
1922
        return t
1923
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
1924
    def create_transport_readonly_server(self):
1925
        """Create a transport server from class defined at init.
1926
2145.1.1 by mbp at sourcefrog
merge urllib keepalive etc
1927
        This is mostly a hook for daughter classes.
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
1928
        """
1929
        return self.transport_readonly_server()
1930
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1931
    def get_readonly_server(self):
1932
        """Get the server instance for the readonly transport
1933
1934
        This is useful for some tests with specific servers to do diagnostics.
1935
        """
1936
        if self.__readonly_server is None:
1937
            if self.transport_readonly_server is None:
1938
                # readonly decorator requested
1939
                # bring up the server
1940
                self.__readonly_server = ReadonlyServer()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1941
                self.__readonly_server.setUp(self.get_vfs_only_server())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1942
            else:
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
1943
                self.__readonly_server = self.create_transport_readonly_server()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1944
                self.__readonly_server.setUp(self.get_vfs_only_server())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1945
            self.addCleanup(self.__readonly_server.tearDown)
1946
        return self.__readonly_server
1947
1948
    def get_readonly_url(self, relpath=None):
1949
        """Get a URL for the readonly transport.
1950
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1951
        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
1952
        used by self.get_url()
1953
        relpath provides for clients to get a path relative to the base url.
1954
        These should only be downwards relative, not upwards.
1955
        """
1956
        base = self.get_readonly_server().get_url()
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1957
        return self._adjust_url(base, relpath)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1958
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1959
    def get_vfs_only_server(self):
2018.5.44 by Andrew Bennetts
Small changes to help a couple more tests pass.
1960
        """Get the vfs only read/write server instance.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1961
1962
        This is useful for some tests with specific servers that need
1963
        diagnostics.
1964
1965
        For TestCaseWithMemoryTransport this is always a MemoryServer, and there
1966
        is no means to override it.
1967
        """
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1968
        if self.__vfs_server is None:
1969
            self.__vfs_server = MemoryServer()
1970
            self.__vfs_server.setUp()
1971
            self.addCleanup(self.__vfs_server.tearDown)
1972
        return self.__vfs_server
1973
1974
    def get_server(self):
1975
        """Get the read/write server instance.
1976
1977
        This is useful for some tests with specific servers that need
1978
        diagnostics.
1979
1980
        This is built from the self.transport_server factory. If that is None,
1981
        then the self.get_vfs_server is returned.
1982
        """
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1983
        if self.__server is None:
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
1984
            if self.transport_server is None or self.transport_server is self.vfs_transport_factory:
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1985
                return self.get_vfs_only_server()
1986
            else:
1987
                # bring up a decorated means of access to the vfs only server.
1988
                self.__server = self.transport_server()
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
1989
                try:
1990
                    self.__server.setUp(self.get_vfs_only_server())
1991
                except TypeError, e:
1992
                    # This should never happen; the try:Except here is to assist
1993
                    # developers having to update code rather than seeing an
1994
                    # uninformative TypeError.
1995
                    raise Exception, "Old server API in use: %s, %s" % (self.__server, e)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1996
            self.addCleanup(self.__server.tearDown)
1997
        return self.__server
1998
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1999
    def _adjust_url(self, base, relpath):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2000
        """Get a URL (or maybe a path) for the readwrite transport.
2001
2002
        This will either be backed by '.' or to an equivalent non-file based
2003
        facility.
2004
        relpath provides for clients to get a path relative to the base url.
2005
        These should only be downwards relative, not upwards.
2006
        """
2007
        if relpath is not None and relpath != '.':
2008
            if not base.endswith('/'):
2009
                base = base + '/'
2010
            # XXX: Really base should be a url; we did after all call
2011
            # get_url()!  But sometimes it's just a path (from
2012
            # LocalAbspathServer), and it'd be wrong to append urlescaped data
2013
            # to a non-escaped local path.
2014
            if base.startswith('./') or base.startswith('/'):
2015
                base += relpath
2016
            else:
2017
                base += urlutils.escape(relpath)
2018
        return base
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2019
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2020
    def get_url(self, relpath=None):
2021
        """Get a URL (or maybe a path) for the readwrite transport.
2022
2023
        This will either be backed by '.' or to an equivalent non-file based
2024
        facility.
2025
        relpath provides for clients to get a path relative to the base url.
2026
        These should only be downwards relative, not upwards.
2027
        """
2028
        base = self.get_server().get_url()
2029
        return self._adjust_url(base, relpath)
2030
2031
    def get_vfs_only_url(self, relpath=None):
2032
        """Get a URL (or maybe a path for the plain old vfs transport.
2033
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2034
        This will never be a smart protocol.  It always has all the
2035
        capabilities of the local filesystem, but it might actually be a
2036
        MemoryTransport or some other similar virtual filesystem.
2037
2399.1.16 by John Arbash Meinel
[merge] bzr.dev 2466
2038
        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
2039
        get_url and get_readonly_url.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2040
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2041
        :param relpath: provides for clients to get a path relative to the base
2042
            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.
2043
        :return: A URL
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2044
        """
2045
        base = self.get_vfs_only_server().get_url()
2046
        return self._adjust_url(base, relpath)
2047
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2048
    def _create_safety_net(self):
2049
        """Make a fake bzr directory.
2050
2875.1.1 by Vincent Ladeuil
Fix #147986 by monitoring a safety .bzr directory.
2051
        This prevents any tests propagating up onto the TEST_ROOT directory's
2052
        real branch.
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2053
        """
2054
        root = TestCaseWithMemoryTransport.TEST_ROOT
2055
        bzrdir.BzrDir.create_standalone_workingtree(root)
2056
2057
    def _check_safety_net(self):
2058
        """Check that the safety .bzr directory have not been touched.
2059
2060
        _make_test_root have created a .bzr directory to prevent tests from
2061
        propagating. This method ensures than a test did not leaked.
2062
        """
2063
        root = TestCaseWithMemoryTransport.TEST_ROOT
2064
        wt = workingtree.WorkingTree.open(root)
2065
        last_rev = wt.last_revision()
2066
        if last_rev != 'null:':
2067
            # The current test have modified the /bzr directory, we need to
2068
            # recreate a new one or all the followng tests will fail.
2069
            # If you need to inspect its content uncomment the following line
2070
            # import pdb; pdb.set_trace()
2071
            _rmtree_temp_dir(root + '/.bzr')
2072
            self._create_safety_net()
2073
            raise AssertionError('%s/.bzr should not be modified' % root)
2074
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2075
    def _make_test_root(self):
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2076
        if TestCaseWithMemoryTransport.TEST_ROOT is None:
2875.1.1 by Vincent Ladeuil
Fix #147986 by monitoring a safety .bzr directory.
2077
            root = osutils.mkdtemp(prefix='testbzr-', suffix='.tmp')
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2078
            TestCaseWithMemoryTransport.TEST_ROOT = root
2079
2080
            self._create_safety_net()
2081
2082
            # The same directory is used by all tests, and we're not
2083
            # specifically told when all tests are finished.  This will do.
2084
            atexit.register(_rmtree_temp_dir, root)
2085
2086
        self.addCleanup(self._check_safety_net)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2087
2088
    def makeAndChdirToTestDir(self):
2089
        """Create a temporary directories for this one test.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2090
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2091
        This must set self.test_home_dir and self.test_dir and chdir to
2092
        self.test_dir.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2093
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2094
        For TestCaseWithMemoryTransport we chdir to the TEST_ROOT for this test.
2095
        """
2096
        os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
2097
        self.test_dir = TestCaseWithMemoryTransport.TEST_ROOT
2098
        self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2099
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2100
    def make_branch(self, relpath, format=None):
2101
        """Create a branch on the transport at relpath."""
2102
        repo = self.make_repository(relpath, format=format)
2103
        return repo.bzrdir.create_branch()
2104
2105
    def make_bzrdir(self, relpath, format=None):
2106
        try:
2107
            # might be a relative or absolute path
2108
            maybe_a_url = self.get_url(relpath)
2109
            segments = maybe_a_url.rsplit('/', 1)
2110
            t = get_transport(maybe_a_url)
2111
            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()
2112
                t.ensure_base()
2230.3.22 by Aaron Bentley
Make test suite use format registry default, not BzrDir default
2113
            if format is None:
2114
                format = 'default'
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
2115
            if isinstance(format, basestring):
2116
                format = bzrdir.format_registry.make_bzrdir(format)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2117
            return format.initialize_on_transport(t)
2118
        except errors.UninitializableFormat:
2119
            raise TestSkipped("Format %s is not initializable." % format)
2120
2121
    def make_repository(self, relpath, shared=False, format=None):
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2122
        """Create a repository on our default transport at relpath.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2123
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2124
        Note that relpath must be a relative path, not a full url.
2125
        """
2126
        # FIXME: If you create a remoterepository this returns the underlying
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2127
        # 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
2128
        # RemoteBzrDir returns a RemoteRepository.
2129
        # maybe  mbp 20070410
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2130
        made_control = self.make_bzrdir(relpath, format=format)
2131
        return made_control.create_repository(shared=shared)
2132
4145.1.2 by Robert Collins
Add a refresh_data method on Repository allowing cleaner handling of insertions into RemoteRepository objects with _real_repository instances.
2133
    def make_smart_server(self, path):
2134
        smart_server = server.SmartTCPServer_for_testing()
2135
        smart_server.setUp(self.get_server())
2136
        remote_transport = get_transport(smart_server.get_url()).clone(path)
2137
        self.addCleanup(smart_server.tearDown)
2138
        return remote_transport
2139
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
2140
    def make_branch_and_memory_tree(self, relpath, format=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2141
        """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
2142
        b = self.make_branch(relpath, format=format)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2143
        return memorytree.MemoryTree.create_on_branch(b)
2144
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
2145
    def make_branch_builder(self, relpath, format=None):
4070.4.3 by Martin Pool
Simplify make_branch_builder
2146
        return branchbuilder.BranchBuilder(self.get_transport(relpath),
2147
            format=format)
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
2148
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2149
    def overrideEnvironmentForTesting(self):
2150
        os.environ['HOME'] = self.test_home_dir
2309.2.6 by Alexander Belchenko
bzr now use Win32 API to determine Application Data location, and don't rely solely on $APPDATA
2151
        os.environ['BZR_HOME'] = self.test_home_dir
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2152
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2153
    def setUp(self):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2154
        super(TestCaseWithMemoryTransport, self).setUp()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2155
        self._make_test_root()
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
2156
        _currentdir = os.getcwdu()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2157
        def _leaveDirectory():
2158
            os.chdir(_currentdir)
2159
        self.addCleanup(_leaveDirectory)
2160
        self.makeAndChdirToTestDir()
2161
        self.overrideEnvironmentForTesting()
2162
        self.__readonly_server = None
2163
        self.__server = None
2381.1.3 by Robert Collins
Review feedback.
2164
        self.reduceLockdirTimeout()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2165
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2166
    def setup_smart_server_with_call_log(self):
2167
        """Sets up a smart server as the transport server with a call log."""
2168
        self.transport_server = server.SmartTCPServer_for_testing
2169
        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.
2170
        import traceback
2171
        # Skip the current stack down to the caller of
2172
        # setup_smart_server_with_call_log
2173
        prefix_length = len(traceback.extract_stack()) - 2
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2174
        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.
2175
            self.hpss_calls.append(
2176
                CapturedCall(params, prefix_length))
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2177
        client._SmartClient.hooks.install_named_hook(
2178
            'call', capture_hpss_call, None)
2179
2180
    def reset_smart_call_log(self):
2181
        self.hpss_calls = []
2182
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2183
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2184
class TestCaseInTempDir(TestCaseWithMemoryTransport):
2185
    """Derived class that runs a test within a temporary directory.
2186
2187
    This is useful for tests that need to create a branch, etc.
2188
2189
    The directory is created in a slightly complex way: for each
2190
    Python invocation, a new temporary top-level directory is created.
2191
    All test cases create their own directory within that.  If the
2192
    tests complete successfully, the directory is removed.
2193
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2194
    :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
2195
    test, which contains a home directory and a work directory.
2196
2197
    :ivar test_home_dir: An initially empty directory under test_base_dir
2198
    which is used as $HOME for this test.
2199
2200
    :ivar test_dir: A directory under test_base_dir used as the current
2201
    directory when the test proper is run.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2202
    """
2203
2204
    OVERRIDE_PYTHON = 'python'
2205
2206
    def check_file_contents(self, filename, expect):
2207
        self.log("check contents of file %s" % filename)
2208
        contents = file(filename, 'r').read()
2209
        if contents != expect:
2210
            self.log("expected: %r" % expect)
2211
            self.log("actually: %r" % contents)
2212
            self.fail("contents of %s not as expected" % filename)
2213
3549.2.4 by Martin Pool
Rename _getTestDirPrefix not to look like a test
2214
    def _getTestDirPrefix(self):
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2215
        # create a directory within the top level test directory
2216
        if sys.platform == 'win32':
2217
            name_prefix = re.sub('[<>*=+",:;_/\\-]', '_', self.id())
2218
            # windows is likely to have path-length limits so use a short name
2219
            name_prefix = name_prefix[-30:]
2220
        else:
2221
            name_prefix = re.sub('[/]', '_', self.id())
2222
        return name_prefix
2223
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2224
    def makeAndChdirToTestDir(self):
2225
        """See TestCaseWithMemoryTransport.makeAndChdirToTestDir().
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2226
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2227
        For TestCaseInTempDir we create a temporary directory based on the test
2228
        name and then create two subdirs - test and home under it.
2229
        """
3613.3.5 by John Arbash Meinel
use the right notation for pathjoin.
2230
        name_prefix = osutils.pathjoin(self.TEST_ROOT, self._getTestDirPrefix())
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2231
        name = name_prefix
2232
        for i in range(100):
2233
            if os.path.exists(name):
2234
                name = name_prefix + '_' + str(i)
2235
            else:
2236
                os.mkdir(name)
2237
                break
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2238
        # now create test and home directories within this dir
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2239
        self.test_base_dir = name
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2240
        self.test_home_dir = self.test_base_dir + '/home'
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2241
        os.mkdir(self.test_home_dir)
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2242
        self.test_dir = self.test_base_dir + '/work'
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2243
        os.mkdir(self.test_dir)
2244
        os.chdir(self.test_dir)
2245
        # put name of test inside
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2246
        f = file(self.test_base_dir + '/name', 'w')
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2247
        try:
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2248
            f.write(self.id())
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2249
        finally:
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2250
            f.close()
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2251
        self.addCleanup(self.deleteTestDir)
2252
2253
    def deleteTestDir(self):
2564.1.1 by Martin Pool
Change out of the test directory before unlinking it, to avoid permission denied errors on Windows (gzlist)
2254
        os.chdir(self.TEST_ROOT)
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2255
        _rmtree_temp_dir(self.test_base_dir)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2256
2193.2.1 by Alexander Belchenko
selftest: build tree for test with binary line-endings by default
2257
    def build_tree(self, shape, line_endings='binary', transport=None):
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2258
        """Build a test tree according to a pattern.
2259
2260
        shape is a sequence of file specifications.  If the final
2261
        character is '/', a directory is created.
2262
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
2263
        This assumes that all the elements in the tree being built are new.
2264
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2265
        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.
2266
3034.4.8 by Alexander Belchenko
TestCaseInTempDir.build_tree now checks type of shape argument.
2267
        :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
2268
        :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.
2269
            in binary mode, exact contents are written in native mode, the
2270
            line endings match the default platform endings.
2271
        :param transport: A transport to write to, for building trees on VFS's.
2272
            If the transport is readonly or None, "." is opened automatically.
2273
        :return: None
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2274
        """
3044.1.1 by Martin Pool
Fix up calls to TestCase.build_tree passing a string rather than a list
2275
        if type(shape) not in (list, tuple):
2276
            raise AssertionError("Parameter 'shape' should be "
2277
                "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.
2278
        # It's OK to just create them using forward slashes on windows.
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2279
        if transport is None or transport.is_readonly():
1553.5.9 by Martin Pool
Add TestCaseWithTransport.get_transport and get_readonly_transport
2280
            transport = get_transport(".")
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2281
        for name in shape:
3757.3.2 by Vincent Ladeuil
Add a credential store for '.netrc'.
2282
            self.assertIsInstance(name, basestring)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2283
            if name[-1] == '/':
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2284
                transport.mkdir(urlutils.escape(name[:-1]))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2285
            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
2286
                if line_endings == 'binary':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2287
                    end = '\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
2288
                elif line_endings == 'native':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2289
                    end = os.linesep
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
2290
                else:
2227.2.2 by v.ladeuil+lp at free
Cleanup.
2291
                    raise errors.BzrError(
2292
                        'Invalid line ending request %r' % line_endings)
1185.85.76 by John Arbash Meinel
Adding an InvalidURL so transports can report they expect utf-8 quoted paths. Updated tests
2293
                content = "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
2294
                transport.put_bytes_non_atomic(urlutils.escape(name), content)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2295
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
2296
    def build_tree_contents(self, shape):
1514 by Robert Collins
Unbreak self.build_tree_shape in tests.
2297
        build_tree_contents(shape)
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
2298
2655.2.5 by Marius Kruger
* Improve BzrRemoveChangedFilesError message.
2299
    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.
2300
        """Assert whether path or paths are in the WorkingTree"""
2301
        if tree is None:
2302
            tree = workingtree.WorkingTree.open(root_path)
2303
        if not isinstance(path, basestring):
2304
            for p in path:
3585.2.1 by Robert Collins
Create acceptance test for bug 150438.
2305
                self.assertInWorkingTree(p, tree=tree)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2306
        else:
2307
            self.assertIsNot(tree.path2id(path), None,
2308
                path+' not in working tree.')
2309
2655.2.5 by Marius Kruger
* Improve BzrRemoveChangedFilesError message.
2310
    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.
2311
        """Assert whether path or paths are not in the WorkingTree"""
2312
        if tree is None:
2313
            tree = workingtree.WorkingTree.open(root_path)
2314
        if not isinstance(path, basestring):
2315
            for p in path:
2316
                self.assertNotInWorkingTree(p,tree=tree)
2317
        else:
2318
            self.assertIs(tree.path2id(path), None, 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
2319
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2320
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2321
class TestCaseWithTransport(TestCaseInTempDir):
2322
    """A test case that provides get_url and get_readonly_url facilities.
2323
2324
    These back onto two transport servers, one for readonly access and one for
2325
    read write access.
2326
2327
    If no explicit class is provided for readonly access, a
2328
    ReadonlyTransportDecorator is used instead which allows the use of non disk
2329
    based read write transports.
2330
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2331
    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.
2332
    readwrite one must both define get_url() as resolving to os.getcwd().
2333
    """
2334
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2335
    def get_vfs_only_server(self):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2336
        """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.
2337
2338
        This is useful for some tests with specific servers that need
2339
        diagnostics.
2340
        """
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2341
        if self.__vfs_server is None:
2342
            self.__vfs_server = self.vfs_transport_factory()
2343
            self.__vfs_server.setUp()
2344
            self.addCleanup(self.__vfs_server.tearDown)
2345
        return self.__vfs_server
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2346
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2347
    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.
2348
        """Create a branch on the transport and a tree locally.
2349
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
2350
        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.
2351
        the transport.  In that case if the vfs_transport_factory is
2352
        LocalURLServer the working tree is created in the local
2018.5.88 by Andrew Bennetts
Clarify make_branch_and_tree docstring a little.
2353
        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.
2354
        repository will also be accessed locally. Otherwise a lightweight
2355
        checkout is created and returned.
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
2356
2357
        :param format: The BzrDirFormat.
2358
        :returns: the WorkingTree.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2359
        """
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.
2360
        # TODO: always use the local disk path for the working tree,
2361
        # this obviously requires a format that supports branch references
2362
        # so check for that by checking bzrdir.BzrDirFormat.get_default_format()
2363
        # RBC 20060208
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2364
        b = self.make_branch(relpath, format=format)
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.
2365
        try:
2366
            return b.bzrdir.create_workingtree()
2367
        except errors.NotLocalUrl:
1910.14.1 by Andrew Bennetts
Fix to make_branch_and_tree's behavior when used with an sftp transport.
2368
            # We can only make working trees locally at the moment.  If the
2018.5.87 by Andrew Bennetts
Make make_branch_and_tree fall back to creating a local checkout if the transport doesn't support working trees, allowing several more Remote tests to pass.
2369
            # transport can't support them, then we keep the non-disk-backed
2370
            # branch and create a local checkout.
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
2371
            if self.vfs_transport_factory is LocalURLServer:
2372
                # the branch is colocated on disk, we cannot create a checkout.
2373
                # hopefully callers will expect this.
2374
                local_controldir= bzrdir.BzrDir.open(self.get_vfs_only_url(relpath))
3489.2.1 by Andrew Bennetts
Fix make_branch_and_tree to return a tree whose .branch is always the right format.
2375
                wt = local_controldir.create_workingtree()
3489.2.5 by Andrew Bennetts
Tweak suggested by John's review.
2376
                if wt.branch._format != b._format:
3489.2.1 by Andrew Bennetts
Fix make_branch_and_tree to return a tree whose .branch is always the right format.
2377
                    wt._branch = b
2378
                    # Make sure that assigning to wt._branch fixes wt.branch,
2379
                    # in case the implementation details of workingtree objects
2380
                    # change.
2381
                    self.assertIs(b, wt.branch)
2382
                return wt
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
2383
            else:
2384
                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.
2385
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
2386
    def assertIsDirectory(self, relpath, transport):
2387
        """Assert that relpath within transport is a directory.
2388
2389
        This may not be possible on all transports; in that case it propagates
2390
        a TransportNotPossible.
2391
        """
2392
        try:
2393
            mode = transport.stat(relpath).st_mode
2394
        except errors.NoSuchFile:
2395
            self.fail("path %s is not a directory; no such file"
2396
                      % (relpath))
2397
        if not stat.S_ISDIR(mode):
2398
            self.fail("path %s is not a directory; has mode %#o"
2399
                      % (relpath, mode))
2400
1852.13.18 by Robert Collins
Write top level acceptance test for dirstate.
2401
    def assertTreesEqual(self, left, right):
2402
        """Check that left and right have the same content and properties."""
2403
        # we use a tree delta to check for equality of the content, and we
2404
        # manually check for equality of other things such as the parents list.
2405
        self.assertEqual(left.get_parent_ids(), right.get_parent_ids())
2406
        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.
2407
        self.assertFalse(differences.has_changed(),
2408
            "Trees %r and %r are different: %r" % (left, right, differences))
1852.13.18 by Robert Collins
Write top level acceptance test for dirstate.
2409
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2410
    def setUp(self):
2411
        super(TestCaseWithTransport, self).setUp()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2412
        self.__vfs_server = None
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2413
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2414
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2415
class ChrootedTestCase(TestCaseWithTransport):
2416
    """A support class that provides readonly urls outside the local namespace.
2417
2418
    This is done by checking if self.transport_server is a MemoryServer. if it
2419
    is then we are chrooted already, if it is not then an HttpServer is used
2420
    for readonly urls.
2421
2422
    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
2423
                       be used without needed to redo it when a different
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2424
                       subclass is in use ?
2425
    """
2426
2427
    def setUp(self):
2428
        super(ChrootedTestCase, self).setUp()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2429
        if not self.vfs_transport_factory == MemoryServer:
2004.1.25 by v.ladeuil+lp at free
Shuffle http related test code. Hopefully it ends up at the right place :)
2430
            self.transport_readonly_server = HttpServer
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2431
2432
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2433
def condition_id_re(pattern):
2434
    """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
2435
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2436
    :param pattern: A regular expression string.
2437
    :return: A callable that returns True if the re matches.
2438
    """
4183.6.5 by Martin Pool
selftest should use re_compile_checked too
2439
    filter_re = osutils.re_compile_checked(pattern, 0,
2440
        'test filter')
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2441
    def condition(test):
2442
        test_id = test.id()
2443
        return filter_re.search(test_id)
2444
    return condition
2445
2446
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
2447
def condition_isinstance(klass_or_klass_list):
2448
    """Create a condition filter which returns isinstance(param, klass).
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2449
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
2450
    :return: A callable which when called with one parameter obj return the
2451
        result of isinstance(obj, klass_or_klass_list).
2452
    """
2453
    def condition(obj):
2454
        return isinstance(obj, klass_or_klass_list)
2455
    return condition
2456
2457
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2458
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.
2459
    """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
2460
3302.8.4 by Vincent Ladeuil
Cosmetic changes.
2461
    :param id_list: A TestIdList object.
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2462
    :return: A callable that returns True if the test's id appears in the list.
2463
    """
2464
    def condition(test):
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
2465
        return id_list.includes(test.id())
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2466
    return condition
2467
2468
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2469
def condition_id_startswith(starts):
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2470
    """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
2471
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2472
    :param starts: A list of string.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2473
    :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.
2474
        the given strings.
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2475
    """
2476
    def condition(test):
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2477
        for start in starts:
2478
            if test.id().startswith(start):
2479
                return True
2480
        return False
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2481
    return condition
2482
2483
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2484
def exclude_tests_by_condition(suite, condition):
2485
    """Create a test suite which excludes some tests from suite.
2486
2487
    :param suite: The suite to get tests from.
2488
    :param condition: A callable whose result evaluates True when called with a
2489
        test case which should be excluded from the result.
2490
    :return: A suite which contains the tests found in suite that fail
2491
        condition.
2492
    """
2493
    result = []
2494
    for test in iter_suite_tests(suite):
2495
        if not condition(test):
2496
            result.append(test)
2497
    return TestUtil.TestSuite(result)
2498
2499
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2500
def filter_suite_by_condition(suite, condition):
2501
    """Create a test suite by filtering another one.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2502
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2503
    :param suite: The source suite.
2504
    :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
2505
        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
2506
    :return: A suite which contains the tests found in suite that pass
2507
        condition.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2508
    """
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2509
    result = []
2510
    for test in iter_suite_tests(suite):
2511
        if condition(test):
2512
            result.append(test)
2513
    return TestUtil.TestSuite(result)
2514
2515
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
2516
def filter_suite_by_re(suite, pattern):
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
2517
    """Create a test suite by filtering another one.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2518
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
2519
    :param suite:           the source suite
2520
    :param pattern:         pattern that names must match
2521
    :returns: the newly created suite
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2522
    """
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2523
    condition = condition_id_re(pattern)
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2524
    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.
2525
    return result_suite
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
2526
2527
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2528
def filter_suite_by_id_list(suite, test_id_list):
2529
    """Create a test suite by filtering another one.
2530
2531
    :param suite: The source suite.
2532
    :param test_id_list: A list of the test ids to keep as strings.
2533
    :returns: the newly created suite
2534
    """
2535
    condition = condition_id_in_list(test_id_list)
2536
    result_suite = filter_suite_by_condition(suite, condition)
2537
    return result_suite
2538
2539
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2540
def filter_suite_by_id_startswith(suite, start):
2541
    """Create a test suite by filtering another one.
2542
2543
    :param suite: The source suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2544
    :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.
2545
    :returns: the newly created suite
2546
    """
2547
    condition = condition_id_startswith(start)
2548
    result_suite = filter_suite_by_condition(suite, condition)
2549
    return result_suite
2550
2551
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
2552
def exclude_tests_by_re(suite, pattern):
2553
    """Create a test suite which excludes some tests from suite.
2554
2555
    :param suite: The suite to get tests from.
2556
    :param pattern: A regular expression string. Test ids that match this
2557
        pattern will be excluded from the result.
2558
    :return: A TestSuite that contains all the tests from suite without the
2559
        tests that matched pattern. The order of tests is the same as it was in
2560
        suite.
2561
    """
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2562
    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
2563
2564
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2565
def preserve_input(something):
2566
    """A helper for performing test suite transformation chains.
2567
2568
    :param something: Anything you want to preserve.
2569
    :return: Something.
2570
    """
2571
    return something
2572
2573
3128.1.2 by Vincent Ladeuil
Tweak as per review feedback: s/randomise.*/randomize&/, 0.92 -> 1.0.
2574
def randomize_suite(suite):
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2575
    """Return a new TestSuite with suite's tests in random order.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2576
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2577
    The tests in the input suite are flattened into a single suite in order to
2578
    accomplish this. Any nested TestSuites are removed to provide global
2579
    randomness.
2580
    """
2921.6.3 by Robert Collins
* New helper method ``bzrlib.tests.randomise_suite`` which returns a
2581
    tests = list(iter_suite_tests(suite))
2582
    random.shuffle(tests)
2583
    return TestUtil.TestSuite(tests)
2584
2585
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2586
def split_suite_by_condition(suite, condition):
2587
    """Split a test suite into two by a condition.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2588
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2589
    :param suite: The suite to split.
2590
    :param condition: The condition to match on. Tests that match this
2591
        condition are returned in the first test suite, ones that do not match
2592
        are in the second suite.
2593
    :return: A tuple of two test suites, where the first contains tests from
2594
        suite matching the condition, and the second contains the remainder
2595
        from suite. The order within each output suite is the same as it was in
2596
        suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2597
    """
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2598
    matched = []
2599
    did_not_match = []
2600
    for test in iter_suite_tests(suite):
2601
        if condition(test):
2602
            matched.append(test)
2603
        else:
2604
            did_not_match.append(test)
2605
    return TestUtil.TestSuite(matched), TestUtil.TestSuite(did_not_match)
2606
2607
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2608
def split_suite_by_re(suite, pattern):
2609
    """Split a test suite into two by a regular expression.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2610
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2611
    :param suite: The suite to split.
2612
    :param pattern: A regular expression string. Test ids that match this
2613
        pattern will be in the first test suite returned, and the others in the
2614
        second test suite returned.
2615
    :return: A tuple of two test suites, where the first contains tests from
2616
        suite matching pattern, and the second contains the remainder from
2617
        suite. The order within each output suite is the same as it was in
2618
        suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2619
    """
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2620
    return split_suite_by_condition(suite, condition_id_re(pattern))
2213.2.1 by Martin Pool
Add selftest --first flag
2621
2622
1185.16.58 by mbp at sourcefrog
- run all selftests by default
2623
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
2624
              stop_on_failure=False,
2213.2.1 by Martin Pool
Add selftest --first flag
2625
              transport=None, lsprof_timed=None, bench_history=None,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2626
              matching_tests_first=None,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2627
              list_only=False,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2628
              random_seed=None,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
2629
              exclude_pattern=None,
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
2630
              strict=False,
2631
              runner_class=None):
2632
    """Run a test suite for bzr selftest.
2633
2634
    :param runner_class: The class of runner to use. Must support the
2635
        constructor arguments passed by run_suite which are more than standard
2636
        python uses.
2637
    :return: A boolean indicating success.
2638
    """
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2639
    TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
2640
    if verbose:
2641
        verbosity = 2
2642
    else:
2643
        verbosity = 1
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
2644
    if runner_class is None:
2645
        runner_class = TextTestRunner
2646
    runner = runner_class(stream=sys.stdout,
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
2647
                            descriptions=0,
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
2648
                            verbosity=verbosity,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2649
                            bench_history=bench_history,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
2650
                            list_only=list_only,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2651
                            )
1185.16.58 by mbp at sourcefrog
- run all selftests by default
2652
    runner.stop_on_failure=stop_on_failure
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2653
    # Initialise the random number generator and display the seed used.
2654
    # We convert the seed to a long to make it reuseable across invocations.
2655
    random_order = False
2656
    if random_seed is not None:
2657
        random_order = True
2658
        if random_seed == "now":
2659
            random_seed = long(time.time())
2660
        else:
2661
            # Convert the seed to a long if we can
2662
            try:
2663
                random_seed = long(random_seed)
2664
            except:
2665
                pass
2666
        runner.stream.writeln("Randomizing test order using seed %s\n" %
2667
            (random_seed))
2668
        random.seed(random_seed)
2669
    # Customise the list of tests if requested
2921.6.5 by Robert Collins
* The ``exclude_pattern`` parameter to the ``bzrlib.tests.`` functions
2670
    if exclude_pattern is not None:
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2671
        suite = exclude_tests_by_re(suite, exclude_pattern)
2672
    if random_order:
3128.1.2 by Vincent Ladeuil
Tweak as per review feedback: s/randomise.*/randomize&/, 0.92 -> 1.0.
2673
        order_changer = randomize_suite
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2674
    else:
2675
        order_changer = preserve_input
2921.6.5 by Robert Collins
* The ``exclude_pattern`` parameter to the ``bzrlib.tests.`` functions
2676
    if pattern != '.*' or random_order:
2213.2.1 by Martin Pool
Add selftest --first flag
2677
        if matching_tests_first:
2921.6.11 by Robert Collins
Last typo.
2678
            suites = map(order_changer, split_suite_by_re(suite, pattern))
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2679
            suite = TestUtil.TestSuite(suites)
2213.2.1 by Martin Pool
Add selftest --first flag
2680
        else:
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2681
            suite = order_changer(filter_suite_by_re(suite, pattern))
3084.1.1 by Andrew Bennetts
Add a --coverage option to selftest.
2682
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
2683
    result = runner.run(suite)
2658.3.4 by Daniel Watkins
'bzr selftest --strict' now fails if there are any unsupported features or tests that are known to fail.
2684
2685
    if strict:
2686
        return result.wasStrictlySuccessful()
2687
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
2688
    return result.wasSuccessful()
2689
2690
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
2691
# Controlled by "bzr selftest -E=..." option
2692
selftest_debug_flags = set()
2693
2694
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
2695
def selftest(verbose=False, pattern=".*", stop_on_failure=True,
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2696
             transport=None,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
2697
             test_suite_factory=None,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
2698
             lsprof_timed=None,
2213.2.1 by Martin Pool
Add selftest --first flag
2699
             bench_history=None,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2700
             matching_tests_first=None,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2701
             list_only=False,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2702
             random_seed=None,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
2703
             exclude_pattern=None,
2704
             strict=False,
3193.1.8 by Vincent Ladeuil
Add '--load-list' option to selftest.
2705
             load_list=None,
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
2706
             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.
2707
             starting_with=None,
4000.2.3 by Robert Collins
Allow extra options to bzrlib.tests.selftest from plugins.
2708
             runner_class=None,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
2709
             ):
1204 by Martin Pool
doc
2710
    """Run the whole test suite under the enhanced runner"""
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
2711
    # XXX: Very ugly way to do this...
2712
    # Disable warning about old formats because we don't want it to disturb
2713
    # any blackbox tests.
2714
    from bzrlib import repository
2715
    repository._deprecation_warning_done = True
2716
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.
2717
    global default_transport
2718
    if transport is None:
2719
        transport = default_transport
2720
    old_transport = default_transport
2721
    default_transport = transport
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
2722
    global selftest_debug_flags
2723
    old_debug_flags = selftest_debug_flags
2724
    if debug_flags is not None:
2725
        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.
2726
    try:
3193.1.8 by Vincent Ladeuil
Add '--load-list' option to selftest.
2727
        if load_list is None:
2728
            keep_only = None
2729
        else:
2730
            keep_only = load_test_id_list(load_list)
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2731
        if test_suite_factory is None:
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
2732
            suite = test_suite(keep_only, starting_with)
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2733
        else:
2734
            suite = test_suite_factory()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2735
        return run_suite(suite, 'testbzr', verbose=verbose, pattern=pattern,
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
2736
                     stop_on_failure=stop_on_failure,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
2737
                     transport=transport,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
2738
                     lsprof_timed=lsprof_timed,
2213.2.1 by Martin Pool
Add selftest --first flag
2739
                     bench_history=bench_history,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2740
                     matching_tests_first=matching_tests_first,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2741
                     list_only=list_only,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2742
                     random_seed=random_seed,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
2743
                     exclude_pattern=exclude_pattern,
4000.2.3 by Robert Collins
Allow extra options to bzrlib.tests.selftest from plugins.
2744
                     strict=strict,
2745
                     runner_class=runner_class,
2746
                     )
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2747
    finally:
2748
        default_transport = old_transport
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
2749
        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.
2750
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
2751
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
2752
def load_test_id_list(file_name):
2753
    """Load a test id list from a text file.
2754
2755
    The format is one test id by line.  No special care is taken to impose
2756
    strict rules, these test ids are used to filter the test suite so a test id
2757
    that do not match an existing test will do no harm. This allows user to add
2758
    comments, leave blank lines, etc.
2759
    """
2760
    test_list = []
2761
    try:
2762
        ftest = open(file_name, 'rt')
2763
    except IOError, e:
2764
        if e.errno != errno.ENOENT:
2765
            raise
2766
        else:
2767
            raise errors.NoSuchFile(file_name)
2768
2769
    for test_name in ftest.readlines():
2770
        test_list.append(test_name.strip())
2771
    ftest.close()
2772
    return test_list
2773
3302.3.3 by Vincent Ladeuil
Fix PEP8 catched by Aaron. Update NEWS.
2774
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
2775
def suite_matches_id_list(test_suite, id_list):
2776
    """Warns about tests not appearing or appearing more than once.
2777
2778
    :param test_suite: A TestSuite object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2779
    :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
2780
         test_suite.
2781
2782
    :return: (absents, duplicates) absents is a list containing the test found
2783
        in id_list but not in test_suite, duplicates is a list containing the
2784
        test found multiple times in test_suite.
2785
2786
    When using a prefined test id list, it may occurs that some tests do not
2787
    exist anymore or that some tests use the same id. This function warns the
2788
    tester about potential problems in his workflow (test lists are volatile)
2789
    or in the test suite itself (using the same id for several tests does not
2790
    help to localize defects).
2791
    """
2792
    # Build a dict counting id occurrences
2793
    tests = dict()
2794
    for test in iter_suite_tests(test_suite):
2795
        id = test.id()
2796
        tests[id] = tests.get(id, 0) + 1
2797
2798
    not_found = []
2799
    duplicates = []
2800
    for id in id_list:
2801
        occurs = tests.get(id, 0)
2802
        if not occurs:
2803
            not_found.append(id)
2804
        elif occurs > 1:
2805
            duplicates.append(id)
2806
2807
    return not_found, duplicates
2808
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
2809
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2810
class TestIdList(object):
2811
    """Test id list to filter a test suite.
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
2812
2813
    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.
2814
    <module>[.<class>.<method>][(<param>+)], <module> being in python dotted
2815
    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
2816
    - 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.
2817
    - keep only the tests listed from the module test suite.
2818
    """
2819
2820
    def __init__(self, test_id_list):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2821
        # When a test suite needs to be filtered against us we compare test ids
2822
        # for equality, so a simple dict offers a quick and simple solution.
2823
        self.tests = dict().fromkeys(test_id_list, True)
2824
2825
        # While unittest.TestCase have ids like:
2826
        # <module>.<class>.<method>[(<param+)],
2827
        # doctest.DocTestCase can have ids like:
2828
        # <module>
2829
        # <module>.<class>
2830
        # <module>.<function>
2831
        # <module>.<class>.<method>
2832
2833
        # Since we can't predict a test class from its name only, we settle on
2834
        # a simple constraint: a test id always begins with its module name.
2835
2836
        modules = {}
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
2837
        for test_id in test_id_list:
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2838
            parts = test_id.split('.')
2839
            mod_name = parts.pop(0)
2840
            modules[mod_name] = True
2841
            for part in parts:
2842
                mod_name += '.' + part
2843
                modules[mod_name] = True
2844
        self.modules = modules
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
2845
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
2846
    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
2847
        """Is there tests for the module or one of its sub modules."""
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2848
        return self.modules.has_key(module_name)
2849
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
2850
    def includes(self, test_id):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2851
        return self.tests.has_key(test_id)
3193.1.5 by Vincent Ladeuil
Add helper method to get only listed tests from a module test suite.
2852
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
2853
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
2854
class TestPrefixAliasRegistry(registry.Registry):
2855
    """A registry for test prefix aliases.
2856
2857
    This helps implement shorcuts for the --starting-with selftest
2858
    option. Overriding existing prefixes is not allowed but not fatal (a
2859
    warning will be emitted).
2860
    """
2861
2862
    def register(self, key, obj, help=None, info=None,
2863
                 override_existing=False):
2864
        """See Registry.register.
2865
2866
        Trying to override an existing alias causes a warning to be emitted,
2867
        not a fatal execption.
2868
        """
2869
        try:
2870
            super(TestPrefixAliasRegistry, self).register(
2871
                key, obj, help=help, info=info, override_existing=False)
2872
        except KeyError:
2873
            actual = self.get(key)
2874
            note('Test prefix alias %s is already used for %s, ignoring %s'
2875
                 % (key, actual, obj))
2876
2877
    def resolve_alias(self, id_start):
2878
        """Replace the alias by the prefix in the given string.
2879
3649.6.3 by Vincent Ladeuil
Fixed typos as per John's review.
2880
        Using an unknown prefix is an error to help catching typos.
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
2881
        """
2882
        parts = id_start.split('.')
2883
        try:
2884
            parts[0] = self.get(parts[0])
2885
        except KeyError:
2886
            raise errors.BzrCommandError(
2887
                '%s is not a known test prefix alias' % parts[0])
2888
        return '.'.join(parts)
2889
2890
2891
test_prefix_alias_registry = TestPrefixAliasRegistry()
3649.6.3 by Vincent Ladeuil
Fixed typos as per John's review.
2892
"""Registry of test prefix aliases."""
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
2893
2894
2895
# This alias allows to detect typos ('bzrlin.') by making all valid test ids
2896
# appear prefixed ('bzrlib.' is "replaced" by 'bzrlib.').
2897
test_prefix_alias_registry.register('bzrlib', 'bzrlib')
2898
2899
# Obvious higest levels prefixes, feel free to add your own via a plugin
2900
test_prefix_alias_registry.register('bd', 'bzrlib.doc')
2901
test_prefix_alias_registry.register('bu', 'bzrlib.utils')
2902
test_prefix_alias_registry.register('bt', 'bzrlib.tests')
2903
test_prefix_alias_registry.register('bb', 'bzrlib.tests.blackbox')
2904
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
2905
2906
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
2907
def test_suite(keep_only=None, starting_with=None):
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2908
    """Build and return TestSuite for the whole of bzrlib.
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
2909
2910
    :param keep_only: A list of test ids limiting the suite returned.
2911
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
2912
    :param starting_with: An id limiting the suite returned to the tests
2913
         starting with it.
2914
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2915
    This function can be replaced if you need to change the default test
2916
    suite on a global basis, but it is not encouraged.
2917
    """
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
2918
    testmod_names = [
3302.9.5 by Vincent Ladeuil
bzrlib.doc switch from test_suite() to load_tests().
2919
                   'bzrlib.doc',
3302.9.6 by Vincent Ladeuil
bzrlib.tests.blackbox switched from test_suite() to load_tests().
2920
                   'bzrlib.tests.blackbox',
3302.9.7 by Vincent Ladeuil
bzrlib.tests.branch_implementations switched from test_suite() to load_tests().
2921
                   'bzrlib.tests.branch_implementations',
3302.9.8 by Vincent Ladeuil
bzrlib.tests.bzrdir_implementations switched from test_suite() to load_tests().
2922
                   'bzrlib.tests.bzrdir_implementations',
3302.9.9 by Vincent Ladeuil
bzrlib.tests.commands switched from test_suite() to load_tests().
2923
                   'bzrlib.tests.commands',
3302.9.10 by Vincent Ladeuil
bzrlib.tests.interrepository_implementations switched from test_suite()
2924
                   'bzrlib.tests.interrepository_implementations',
3302.9.12 by Vincent Ladeuil
bzrlib.tests.intertree_implementations switched from test_suite()
2925
                   'bzrlib.tests.intertree_implementations',
3750.1.3 by Vincent Ladeuil
Cleanups.
2926
                   'bzrlib.tests.inventory_implementations',
4000.5.3 by Jelmer Vernooij
Add tests for InterBranch.
2927
                   'bzrlib.tests.per_interbranch',
3302.9.13 by Vincent Ladeuil
bzrlib.tests.per_lock switched from test_suite() to load_tests().
2928
                   'bzrlib.tests.per_lock',
3689.1.1 by John Arbash Meinel
Rename repository_implementations tests into per_repository tests
2929
                   'bzrlib.tests.per_repository',
3750.1.3 by Vincent Ladeuil
Cleanups.
2930
                   'bzrlib.tests.per_repository_reference',
2474.1.57 by John Arbash Meinel
Move code around to refactor according to our pyrex extension design.
2931
                   'bzrlib.tests.test__dirstate_helpers',
3750.1.3 by Vincent Ladeuil
Cleanups.
2932
                   'bzrlib.tests.test__walkdirs_win32',
1518 by Robert Collins
Merge from mbp.
2933
                   'bzrlib.tests.test_ancestry',
1551.9.17 by Aaron Bentley
Annotate for working trees across all parents
2934
                   'bzrlib.tests.test_annotate',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
2935
                   'bzrlib.tests.test_api',
1755.3.6 by John Arbash Meinel
Add a test suite for Atomic File, and clean it up so that it really does set the mode properly.
2936
                   'bzrlib.tests.test_atomicfile',
1518 by Robert Collins
Merge from mbp.
2937
                   'bzrlib.tests.test_bad_files',
2890.2.3 by Robert Collins
* New module ``bzrlib.bisect_multi`` with generic multiple-bisection-at-once
2938
                   'bzrlib.tests.test_bisect_multi',
1518 by Robert Collins
Merge from mbp.
2939
                   'bzrlib.tests.test_branch',
2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
2940
                   'bzrlib.tests.test_branchbuilder',
3641.3.1 by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests.
2941
                   'bzrlib.tests.test_btree_index',
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
2942
                   'bzrlib.tests.test_bugtracker',
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
2943
                   'bzrlib.tests.test_bundle',
1534.4.39 by Robert Collins
Basic BzrDir support.
2944
                   'bzrlib.tests.test_bzrdir',
1911.2.3 by John Arbash Meinel
Moving everything into a new location so that we can cache more than just revision ids
2945
                   'bzrlib.tests.test_cache_utf8',
4020.1.2 by Jelmer Vernooij
Import blackbox test for clean-tree, run regular tests.
2946
                   'bzrlib.tests.test_clean_tree',
3641.3.1 by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests.
2947
                   'bzrlib.tests.test_chunk_writer',
3890.2.8 by John Arbash Meinel
Move everything into properly parameterized tests.
2948
                   'bzrlib.tests.test__chunks_to_lines',
2172.1.3 by Aaron Bentley
Rename test_commands in the test suite
2949
                   'bzrlib.tests.test_commands',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
2950
                   'bzrlib.tests.test_commit',
2951
                   'bzrlib.tests.test_commit_merge',
2952
                   'bzrlib.tests.test_config',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2953
                   'bzrlib.tests.test_conflicts',
2475.4.1 by Martin Pool
Start adding CountedLock class to partially replace LockableFiles
2954
                   'bzrlib.tests.test_counted_lock',
1551.3.11 by Aaron Bentley
Merge from Robert
2955
                   'bzrlib.tests.test_decorators',
2225.1.1 by Aaron Bentley
Added revert change display, with tests
2956
                   'bzrlib.tests.test_delta',
4070.8.3 by Martin Pool
Finish debug_flags support and add a test case
2957
                   'bzrlib.tests.test_debug',
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
2958
                   'bzrlib.tests.test_deprecated_graph',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2959
                   'bzrlib.tests.test_diff',
3750.1.3 by Vincent Ladeuil
Cleanups.
2960
                   'bzrlib.tests.test_directory_service',
1852.13.6 by Robert Collins
start hooking in the prototype dirstate serialiser.
2961
                   'bzrlib.tests.test_dirstate',
2625.6.1 by Adeodato Simó
New EmailMessage class, façade around email.Message and MIMEMultipart.
2962
                   'bzrlib.tests.test_email_message',
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
2963
                   'bzrlib.tests.test_errors',
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
2964
                   'bzrlib.tests.test_export',
1731.2.16 by Aaron Bentley
Get extract working for standalone trees
2965
                   'bzrlib.tests.test_extract',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2966
                   'bzrlib.tests.test_fetch',
3885.1.1 by John Arbash Meinel
Start working on a FIFOCache.
2967
                   'bzrlib.tests.test_fifo_cache',
3368.2.3 by Ian Clatworthy
tests for ..input_file and ..output_lines
2968
                   'bzrlib.tests.test_filters',
1752.5.4 by Andrew Bennetts
Merge from bzr.dev.
2969
                   'bzrlib.tests.test_ftp_transport',
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
2970
                   'bzrlib.tests.test_foreign',
2215.5.1 by Alexander Belchenko
Fix generation of rstx man page (problem with short names of options) and provide simple tests for future.
2971
                   'bzrlib.tests.test_generate_docs',
2116.4.1 by John Arbash Meinel
Update file and revision id generators.
2972
                   'bzrlib.tests.test_generate_ids',
2135.2.7 by Kent Gibson
Implement JAM's review suggestions.
2973
                   'bzrlib.tests.test_globbing',
1518 by Robert Collins
Merge from mbp.
2974
                   'bzrlib.tests.test_gpg',
2975
                   'bzrlib.tests.test_graph',
2976
                   'bzrlib.tests.test_hashcache',
2425.2.2 by Robert Collins
``bzr help`` now provides cross references to other help topics using the
2977
                   'bzrlib.tests.test_help',
2553.1.1 by Robert Collins
Give Hooks names.
2978
                   'bzrlib.tests.test_hooks',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2979
                   'bzrlib.tests.test_http',
3111.1.6 by Vincent Ladeuil
Begin refactoring test_http.py into parameterized tests.
2980
                   'bzrlib.tests.test_http_implementations',
1786.1.8 by John Arbash Meinel
[merge] Johan Rydberg test updates
2981
                   'bzrlib.tests.test_http_response',
2298.5.1 by Alexander Belchenko
Bugfix #82086: Searching location of CA bundle for PyCurl in env variable (CURL_CA_BUNDLE), and on win32 along the PATH
2982
                   'bzrlib.tests.test_https_ca_bundle',
1518 by Robert Collins
Merge from mbp.
2983
                   'bzrlib.tests.test_identitymap',
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
2984
                   'bzrlib.tests.test_ignores',
2592.1.4 by Robert Collins
Create a GraphIndexBuilder.
2985
                   'bzrlib.tests.test_index',
2363.5.2 by Aaron Bentley
Implement layout description
2986
                   'bzrlib.tests.test_info',
1518 by Robert Collins
Merge from mbp.
2987
                   'bzrlib.tests.test_inv',
1563.2.4 by Robert Collins
First cut at including the knit implementation of versioned_file.
2988
                   'bzrlib.tests.test_knit',
1996.1.1 by John Arbash Meinel
Adding a ScopeReplacer class, which can replace itself on demand
2989
                   'bzrlib.tests.test_lazy_import',
2063.4.1 by John Arbash Meinel
bzrlib.lazy_regex.lazy_compile creates a proxy object around re.compile()
2990
                   'bzrlib.tests.test_lazy_regex',
3750.1.3 by Vincent Ladeuil
Cleanups.
2991
                   'bzrlib.tests.test_lockable_files',
1553.5.12 by Martin Pool
New LockDir locking mechanism
2992
                   'bzrlib.tests.test_lockdir',
1518 by Robert Collins
Merge from mbp.
2993
                   'bzrlib.tests.test_log',
3750.1.3 by Vincent Ladeuil
Cleanups.
2994
                   'bzrlib.tests.test_lru_cache',
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
2995
                   'bzrlib.tests.test_lsprof',
2681.1.8 by Aaron Bentley
Add Thunderbird support to bzr send
2996
                   'bzrlib.tests.test_mail_client',
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
2997
                   'bzrlib.tests.test_memorytree',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2998
                   'bzrlib.tests.test_merge',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
2999
                   'bzrlib.tests.test_merge3',
1518 by Robert Collins
Merge from mbp.
3000
                   'bzrlib.tests.test_merge_core',
1551.12.2 by Aaron Bentley
Got directives round-tripping, with bundles and everything
3001
                   'bzrlib.tests.test_merge_directive',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
3002
                   'bzrlib.tests.test_missing',
1518 by Robert Collins
Merge from mbp.
3003
                   'bzrlib.tests.test_msgeditor',
2520.4.2 by Aaron Bentley
Integrate mpdiff into bazaar
3004
                   'bzrlib.tests.test_multiparent',
3335.1.1 by Jelmer Vernooij
Add tests for mutabletree hooks.
3005
                   'bzrlib.tests.test_mutabletree',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
3006
                   'bzrlib.tests.test_nonascii',
1518 by Robert Collins
Merge from mbp.
3007
                   'bzrlib.tests.test_options',
1185.50.20 by John Arbash Meinel
merge permissions branch, also fixup tests so they are lined up with bzr.dev to help prevent conflicts.
3008
                   'bzrlib.tests.test_osutils',
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
3009
                   'bzrlib.tests.test_osutils_encodings',
2617.4.2 by Robert Collins
Add FileCollection support class.
3010
                   'bzrlib.tests.test_pack',
3582.3.1 by Martin Pool
Split pack repository tests into their own file and use scenarios
3011
                   'bzrlib.tests.test_pack_repository',
1558.15.6 by Aaron Bentley
Added more tests
3012
                   'bzrlib.tests.test_patch',
1185.82.9 by John Arbash Meinel
Moving patches testing into main test suite.
3013
                   'bzrlib.tests.test_patches',
1185.58.1 by John Arbash Meinel
Added new permissions test (currently don't pass)
3014
                   'bzrlib.tests.test_permissions',
1515 by Robert Collins
* Plugins with the same name in different directories in the bzr plugin
3015
                   'bzrlib.tests.test_plugins',
1551.2.27 by Aaron Bentley
Got propogation under test
3016
                   'bzrlib.tests.test_progress',
3302.9.22 by Vincent Ladeuil
bzrlib.tests.test_read_bundle use load_tests.
3017
                   'bzrlib.tests.test_read_bundle',
3750.1.3 by Vincent Ladeuil
Cleanups.
3018
                   'bzrlib.tests.test_reconcile',
2796.2.1 by Aaron Bentley
Begin work on reconfigure command
3019
                   'bzrlib.tests.test_reconfigure',
1911.4.3 by John Arbash Meinel
[merge] Adeodato Simó: change factory => registry
3020
                   'bzrlib.tests.test_registry',
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
3021
                   'bzrlib.tests.test_remote',
3193.8.4 by Aaron Bentley
Get rename detection working for files.
3022
                   'bzrlib.tests.test_rename_map',
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
3023
                   'bzrlib.tests.test_repository',
1551.8.15 by Aaron Bentley
bug #54172: handle new directories properly in revert
3024
                   'bzrlib.tests.test_revert',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
3025
                   'bzrlib.tests.test_revision',
3298.2.7 by John Arbash Meinel
Rename test_revisionnamespaces => test_revisionspec
3026
                   'bzrlib.tests.test_revisionspec',
1773.2.1 by Robert Collins
Teach all trees about unknowns, conflicts and get_parent_ids.
3027
                   'bzrlib.tests.test_revisiontree',
1185.47.1 by Martin Pool
[broken] start converting basic_io to more rfc822-like format
3028
                   'bzrlib.tests.test_rio',
3398.1.15 by Ian Clatworthy
search branch.rules and bazaar.rules for preferences
3029
                   'bzrlib.tests.test_rules',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
3030
                   'bzrlib.tests.test_sampler',
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
3031
                   'bzrlib.tests.test_selftest',
1185.33.89 by Martin Pool
[patch] add a selftest test that the setup build script works (Alexander Belchenko)
3032
                   'bzrlib.tests.test_setup',
1185.50.20 by John Arbash Meinel
merge permissions branch, also fixup tests so they are lined up with bzr.dev to help prevent conflicts.
3033
                   'bzrlib.tests.test_sftp_transport',
0.14.24 by Aaron Bentley
Merge with serialize-transform
3034
                   'bzrlib.tests.test_shelf',
0.16.89 by Aaron Bentley
Add tests for Shelver
3035
                   'bzrlib.tests.test_shelf_ui',
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
3036
                   'bzrlib.tests.test_smart',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
3037
                   'bzrlib.tests.test_smart_add',
3990.3.2 by Andrew Bennetts
Fix the do_body NotImplementedError log spam.
3038
                   'bzrlib.tests.test_smart_request',
1910.19.1 by Andrew Bennetts
Support bzr:// urls to work with the new RPC-based transport which will be used
3039
                   'bzrlib.tests.test_smart_transport',
2535.2.1 by Adeodato Simó
New SMTPConnection class, a reduced version of that in bzr-email.
3040
                   'bzrlib.tests.test_smtp_connection',
1522 by Robert Collins
Test for the number of uses of self.working_tree() in branch.py
3041
                   'bzrlib.tests.test_source',
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
3042
                   'bzrlib.tests.test_ssh_transport',
1551.6.19 by Aaron Bentley
Fix pending merge status on empty trees
3043
                   'bzrlib.tests.test_status',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
3044
                   'bzrlib.tests.test_store',
2018.5.157 by Andrew Bennetts
Remove unnecessary trivial divergences from bzr.dev.
3045
                   'bzrlib.tests.test_strace',
1731.2.4 by Aaron Bentley
Ensure subsume works with Knit2 repos
3046
                   'bzrlib.tests.test_subsume',
2999.1.1 by Ian Clatworthy
migrate switch command into the core - was in BzrTools
3047
                   'bzrlib.tests.test_switch',
1534.2.1 by Robert Collins
Implement deprecated_method
3048
                   'bzrlib.tests.test_symbol_versioning',
2220.2.11 by mbp at sourcefrog
Get tag tests working again, stored in the Branch
3049
                   'bzrlib.tests.test_tag',
1518 by Robert Collins
Merge from mbp.
3050
                   'bzrlib.tests.test_testament',
1558.15.1 by Aaron Bentley
Add text_file function
3051
                   'bzrlib.tests.test_textfile',
1551.6.7 by Aaron Bentley
Implemented two-way merge, refactored weave merge
3052
                   'bzrlib.tests.test_textmerge',
1551.12.29 by Aaron Bentley
Copy and extend patch date formatting code, add patch-date parsing
3053
                   'bzrlib.tests.test_timestamp',
1518 by Robert Collins
Merge from mbp.
3054
                   'bzrlib.tests.test_trace',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
3055
                   'bzrlib.tests.test_transactions',
1534.7.1 by Aaron Bentley
Got creation of a versioned file working
3056
                   'bzrlib.tests.test_transform',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
3057
                   'bzrlib.tests.test_transport',
3302.9.21 by Vincent Ladeuil
bzrlib.tests.test_transport_implementations use load_tests.
3058
                   'bzrlib.tests.test_transport_implementations',
3675.1.1 by Martin Pool
Merge and update log+ transport decorator
3059
                   'bzrlib.tests.test_transport_log',
1852.8.2 by Robert Collins
Add InterTree class to represent InterTree operations.
3060
                   'bzrlib.tests.test_tree',
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
3061
                   'bzrlib.tests.test_treebuilder',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
3062
                   'bzrlib.tests.test_tsort',
1666.1.2 by Robert Collins
Fix race condition between end of stream and end of file with tuned_gzip.
3063
                   'bzrlib.tests.test_tuned_gzip',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
3064
                   'bzrlib.tests.test_ui',
3280.4.1 by John Arbash Meinel
Add uncommit --local.
3065
                   'bzrlib.tests.test_uncommit',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
3066
                   'bzrlib.tests.test_upgrade',
3602.2.2 by Martin Pool
Make tests for stacked upgrade scenario-based
3067
                   'bzrlib.tests.test_upgrade_stacked',
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
3068
                   'bzrlib.tests.test_urlutils',
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
3069
                   'bzrlib.tests.test_version',
2022.1.1 by John Arbash Meinel
[merge] version-info plugin, and cleanup for layout in bzr
3070
                   'bzrlib.tests.test_version_info',
3750.1.3 by Vincent Ladeuil
Cleanups.
3071
                   'bzrlib.tests.test_versionedfile',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
3072
                   'bzrlib.tests.test_weave',
3073
                   'bzrlib.tests.test_whitebox',
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
3074
                   'bzrlib.tests.test_win32utils',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
3075
                   'bzrlib.tests.test_workingtree',
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
3076
                   'bzrlib.tests.test_workingtree_4',
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
3077
                   'bzrlib.tests.test_wsgi',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
3078
                   'bzrlib.tests.test_xml',
3302.9.15 by Vincent Ladeuil
bzrlib.tests.tree_implementations switched from test_suite() to
3079
                   'bzrlib.tests.tree_implementations',
3302.9.16 by Vincent Ladeuil
bzrlib.tests.workingtree_implementations switched from
3080
                   'bzrlib.tests.workingtree_implementations',
3750.1.3 by Vincent Ladeuil
Cleanups.
3081
                   'bzrlib.util.tests.test_bencode',
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
3082
                   ]
3302.9.23 by Vincent Ladeuil
Simplify test_suite().
3083
1707.2.2 by Robert Collins
Start on bench_add, an add benchtest.
3084
    loader = TestUtil.TestLoader()
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3085
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3086
    if starting_with:
3087
        starting_with = [test_prefix_alias_registry.resolve_alias(start)
3088
                         for start in 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.
3089
        # We take precedence over keep_only because *at loading time* using
3090
        # 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.
3091
        def interesting_module(name):
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3092
            for start in starting_with:
3093
                if (
3094
                    # Either the module name starts with the specified string
3095
                    name.startswith(start)
3096
                    # or it may contain tests starting with the specified string
3097
                    or start.startswith(name)
3098
                    ):
3099
                    return True
3100
            return False
3302.11.6 by Vincent Ladeuil
Fixed as per Martin and John reviews. Also fix a bug.
3101
        loader = TestUtil.FilteredByModuleTestLoader(interesting_module)
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3102
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3103
    elif keep_only is not None:
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3104
        id_filter = TestIdList(keep_only)
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3105
        loader = TestUtil.FilteredByModuleTestLoader(id_filter.refers_to)
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3106
        def interesting_module(name):
3107
            return id_filter.refers_to(name)
3108
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3109
    else:
3110
        loader = TestUtil.TestLoader()
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3111
        def interesting_module(name):
3112
            # No filtering, all modules are interesting
3113
            return True
3114
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3115
    suite = loader.suiteClass()
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3116
3117
    # modules building their suite with loadTestsFromModuleNames
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3118
    suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3119
3302.8.13 by Vincent Ladeuil
DocTests can now be filtered at module level too.
3120
    modules_to_doctest = [
3121
        'bzrlib',
3825.3.2 by Martin Pool
Correct example of branchbuilder and change to a doctest, and refactor
3122
        'bzrlib.branchbuilder',
3302.8.13 by Vincent Ladeuil
DocTests can now be filtered at module level too.
3123
        'bzrlib.export',
3124
        'bzrlib.inventory',
3125
        'bzrlib.iterablefile',
3126
        'bzrlib.lockdir',
3127
        'bzrlib.merge3',
3128
        'bzrlib.option',
3388.1.2 by Martin Pool
Add new symbol_versioning.deprecated_in
3129
        'bzrlib.symbol_versioning',
3302.8.13 by Vincent Ladeuil
DocTests can now be filtered at module level too.
3130
        'bzrlib.tests',
3131
        'bzrlib.timestamp',
3132
        'bzrlib.version_info_formats.format_custom',
3133
        ]
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3134
3302.8.13 by Vincent Ladeuil
DocTests can now be filtered at module level too.
3135
    for mod in modules_to_doctest:
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3136
        if not interesting_module(mod):
3302.8.13 by Vincent Ladeuil
DocTests can now be filtered at module level too.
3137
            # No tests to keep here, move along
3138
            continue
1996.3.5 by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again.
3139
        try:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3140
            # note that this really does mean "report only" -- doctest
3825.3.4 by Martin Pool
Doc
3141
            # still runs the rest of the examples
3825.3.3 by Martin Pool
Doctests now stop on the first failure
3142
            doc_suite = doctest.DocTestSuite(mod,
3825.3.5 by Martin Pool
Fix tab damage
3143
                optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
1996.3.5 by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again.
3144
        except ValueError, e:
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3145
            print '**failed to get doctest for: %s\n%s' % (mod, e)
1996.3.5 by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again.
3146
            raise
3825.3.1 by Martin Pool
selftest errors if modules said to have doctests don't have them
3147
        if len(doc_suite._tests) == 0:
3148
            raise errors.BzrError("no doctests found in %s" % (mod,))
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3149
        suite.addTest(doc_suite)
3150
2762.2.1 by Robert Collins
* ``bzr plugins`` now lists the version number for each plugin in square
3151
    default_encoding = sys.getdefaultencoding()
3221.4.1 by Martin Pool
Treat failure to load plugin test suites as a fatal error
3152
    for name, plugin in bzrlib.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.
3153
        if not interesting_module(plugin.module.__name__):
3154
            continue
3221.4.1 by Martin Pool
Treat failure to load plugin test suites as a fatal error
3155
        plugin_suite = plugin.test_suite()
3156
        # We used to catch ImportError here and turn it into just a warning,
3157
        # but really if you don't have --no-plugins this should be a failure.
3158
        # mbp 20080213 - see http://bugs.launchpad.net/bugs/189771
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3159
        if plugin_suite is None:
3302.8.21 by Vincent Ladeuil
Fixed as per Robert's review.
3160
            plugin_suite = plugin.load_plugin_tests(loader)
3221.4.1 by Martin Pool
Treat failure to load plugin test suites as a fatal error
3161
        if plugin_suite is not None:
3162
            suite.addTest(plugin_suite)
2762.2.1 by Robert Collins
* ``bzr plugins`` now lists the version number for each plugin in square
3163
        if default_encoding != sys.getdefaultencoding():
3164
            bzrlib.trace.warning(
3165
                'Plugin "%s" tried to reset default encoding to: %s', name,
3166
                sys.getdefaultencoding())
3167
            reload(sys)
3168
            sys.setdefaultencoding(default_encoding)
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3169
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3170
    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.
3171
        suite = filter_suite_by_id_startswith(suite, starting_with)
3172
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3173
    if keep_only is not None:
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3174
        # Now that the referred modules have loaded their tests, keep only the
3175
        # requested ones.
3176
        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
3177
        # Do some sanity checks on the id_list filtering
3178
        not_found, duplicates = suite_matches_id_list(suite, keep_only)
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3179
        if starting_with:
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3180
            # The tester has used both keep_only and starting_with, so he is
3181
            # already aware that some tests are excluded from the list, there
3182
            # 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.
3183
            pass
3184
        else:
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3185
            # Some tests mentioned in the list are not in the test suite. The
3186
            # 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.
3187
            for id in not_found:
3188
                bzrlib.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
3189
        for id in duplicates:
3190
            bzrlib.trace.warning('"%s" is used as an id by several tests', id)
3191
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
3192
    return suite
764 by Martin Pool
- log messages from a particular test are printed if that test fails
3193
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
3194
2745.6.58 by Andrew Bennetts
Slightly neater test parameterisation in repository_implementations; extract a 'multiply_scenarios' function.
3195
def multiply_scenarios(scenarios_left, scenarios_right):
3196
    """Multiply two sets of scenarios.
3197
3198
    :returns: the cartesian product of the two sets of scenarios, that is
3199
        a scenario for every possible combination of a left scenario and a
3200
        right scenario.
3201
    """
3202
    return [
3203
        ('%s,%s' % (left_name, right_name),
3204
         dict(left_dict.items() + right_dict.items()))
3205
        for left_name, left_dict in scenarios_left
3206
        for right_name, right_dict in scenarios_right]
3207
3208
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
3209
def multiply_tests(tests, scenarios, result):
3210
    """Multiply tests_list by scenarios into result.
3211
3212
    This is the core workhorse for test parameterisation.
3213
3214
    Typically the load_tests() method for a per-implementation test suite will
3215
    call multiply_tests and return the result.
3216
3217
    :param tests: The tests to parameterise.
3218
    :param scenarios: The scenarios to apply: pairs of (scenario_name,
3219
        scenario_param_dict).
3220
    :param result: A TestSuite to add created tests to.
3221
3222
    This returns the passed in result TestSuite with the cross product of all
3223
    the tests repeated once for each scenario.  Each test is adapted by adding
3224
    the scenario name at the end of its id(), and updating the test object's
3225
    __dict__ with the scenario_param_dict.
3226
3227
    >>> r = multiply_tests(
3228
    ...     bzrlib.tests.test_sampler.DemoTest('test_nothing'),
3229
    ...     [('one', dict(param=1)),
3230
    ...      ('two', dict(param=2))],
3231
    ...     TestSuite())
3232
    >>> tests = list(iter_suite_tests(r))
3233
    >>> len(tests)
3234
    2
3235
    >>> tests[0].id()
3236
    'bzrlib.tests.test_sampler.DemoTest.test_nothing(one)'
3237
    >>> tests[0].param
3238
    1
3239
    >>> tests[1].param
3240
    2
3241
    """
3242
    for test in iter_suite_tests(tests):
3243
        apply_scenarios(test, scenarios, result)
3244
    return result
3245
3246
3247
def apply_scenarios(test, scenarios, result):
3248
    """Apply the scenarios in scenarios to test and add to result.
3249
3250
    :param test: The test to apply scenarios to.
3251
    :param scenarios: An iterable of scenarios to apply to test.
3252
    :return: result
3253
    :seealso: apply_scenario
3254
    """
3255
    for scenario in scenarios:
3256
        result.addTest(apply_scenario(test, scenario))
3257
    return result
3258
3259
3260
def apply_scenario(test, scenario):
3261
    """Copy test and apply scenario to it.
3262
3263
    :param test: A test to adapt.
3264
    :param scenario: A tuple describing the scenarion.
3265
        The first element of the tuple is the new test id.
3266
        The second element is a dict containing attributes to set on the
3267
        test.
3268
    :return: The adapted test.
3269
    """
3270
    new_id = "%s(%s)" % (test.id(), scenario[0])
3271
    new_test = clone_test(test, new_id)
3272
    for name, value in scenario[1].items():
3273
        setattr(new_test, name, value)
3274
    return new_test
3275
3276
3277
def clone_test(test, new_id):
3278
    """Clone a test giving it a new id.
3279
3280
    :param test: The test to clone.
3281
    :param new_id: The id to assign to it.
3282
    :return: The new test.
3283
    """
3284
    from copy import deepcopy
3285
    new_test = deepcopy(test)
3286
    new_test.id = lambda: new_id
3287
    return new_test
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
3288
3289
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
3290
def _rmtree_temp_dir(dirname):
2485.6.4 by Martin Pool
Move unicode handling code into _rmtree_temp_dir
3291
    # If LANG=C we probably have created some bogus paths
3292
    # which rmtree(unicode) will fail to delete
3293
    # so make sure we are using rmtree(str) to delete everything
3294
    # except on win32, where rmtree(str) will fail
3295
    # since it doesn't have the property of byte-stream paths
3296
    # (they are either ascii or mbcs)
3297
    if sys.platform == 'win32':
3298
        # make sure we are using the unicode win32 api
3299
        dirname = unicode(dirname)
3300
    else:
3301
        dirname = dirname.encode(sys.getfilesystemencoding())
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
3302
    try:
3303
        osutils.rmtree(dirname)
3304
    except OSError, e:
3305
        if sys.platform == 'win32' and e.errno == errno.EACCES:
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
3306
            sys.stderr.write(('Permission denied: '
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
3307
                                 'unable to remove testing dir '
2946.1.1 by Alexander Belchenko
trivial fix for string formatting in rmtree_temp_dir
3308
                                 '%s\n' % os.path.basename(dirname)))
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
3309
        else:
3310
            raise
3311
3312
2367.1.4 by Robert Collins
Add operating system Feature model to bzrlib.tests to allow writing tests
3313
class Feature(object):
3314
    """An operating system Feature."""
3315
3316
    def __init__(self):
3317
        self._available = None
3318
3319
    def available(self):
3320
        """Is the feature available?
3321
3322
        :return: True if the feature is available.
3323
        """
3324
        if self._available is None:
3325
            self._available = self._probe()
3326
        return self._available
3327
3328
    def _probe(self):
3329
        """Implement this method in concrete features.
3330
3331
        :return: True if the feature is available.
3332
        """
3333
        raise NotImplementedError
3334
3335
    def __str__(self):
3336
        if getattr(self, 'feature_name', None):
3337
            return self.feature_name()
3338
        return self.__class__.__name__
2553.2.3 by Robert Collins
Split out the common test scenario support from the repository implementation specific code.
3339
3340
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
3341
class _SymlinkFeature(Feature):
3342
3343
    def _probe(self):
3344
        return osutils.has_symlinks()
3345
3346
    def feature_name(self):
3347
        return 'symlinks'
3348
3349
SymlinkFeature = _SymlinkFeature()
3350
3351
3136.1.1 by Aaron Bentley
Add support for hardlinks to TreeTransform
3352
class _HardlinkFeature(Feature):
3353
3354
    def _probe(self):
3355
        return osutils.has_hardlinks()
3356
3357
    def feature_name(self):
3358
        return 'hardlinks'
3359
3360
HardlinkFeature = _HardlinkFeature()
3361
3362
2949.5.2 by Alexander Belchenko
John's review
3363
class _OsFifoFeature(Feature):
3364
3365
    def _probe(self):
3366
        return getattr(os, 'mkfifo', None)
3367
3368
    def feature_name(self):
3369
        return 'filesystem fifos'
3370
3371
OsFifoFeature = _OsFifoFeature()
3372
3373
3477.1.2 by John Arbash Meinel
Rename UnicodeFilename => UnicodeFilenameFeature
3374
class _UnicodeFilenameFeature(Feature):
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
3375
    """Does the filesystem support Unicode filenames?"""
3376
3377
    def _probe(self):
3378
        try:
3526.2.1 by Martin von Gagern
Improved UnicodeFilenameFeature.
3379
            # Check for character combinations unlikely to be covered by any
3380
            # single non-unicode encoding. We use the characters
3381
            # - greek small letter alpha (U+03B1) and
3382
            # - braille pattern dots-123456 (U+283F).
3383
            os.stat(u'\u03b1\u283f')
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
3384
        except UnicodeEncodeError:
3385
            return False
3386
        except (IOError, OSError):
3387
            # The filesystem allows the Unicode filename but the file doesn't
3388
            # exist.
3389
            return True
3390
        else:
3391
            # The filesystem allows the Unicode filename and the file exists,
3392
            # for some reason.
3393
            return True
3394
3477.1.2 by John Arbash Meinel
Rename UnicodeFilename => UnicodeFilenameFeature
3395
UnicodeFilenameFeature = _UnicodeFilenameFeature()
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
3396
3397
2785.1.5 by Alexander Belchenko
support for non-ascii BZR_HOME in show_version()
3398
def probe_unicode_in_user_encoding():
3399
    """Try to encode several unicode strings to use in unicode-aware tests.
3400
    Return first successfull match.
3401
3402
    :return:  (unicode value, encoded plain string value) or (None, None)
3403
    """
3404
    possible_vals = [u'm\xb5', u'\xe1', u'\u0410']
3405
    for uni_val in possible_vals:
3406
        try:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
3407
            str_val = uni_val.encode(osutils.get_user_encoding())
2785.1.5 by Alexander Belchenko
support for non-ascii BZR_HOME in show_version()
3408
        except UnicodeEncodeError:
3409
            # Try a different character
3410
            pass
3411
        else:
3412
            return uni_val, str_val
3413
    return None, None
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
3414
3415
2839.6.2 by Alexander Belchenko
changes after Martin's review
3416
def probe_bad_non_ascii(encoding):
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
3417
    """Try to find [bad] character with code [128..255]
2839.6.2 by Alexander Belchenko
changes after Martin's review
3418
    that cannot be decoded to unicode in some encoding.
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
3419
    Return None if all non-ascii characters is valid
2839.6.2 by Alexander Belchenko
changes after Martin's review
3420
    for given encoding.
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
3421
    """
3422
    for i in xrange(128, 256):
3423
        char = chr(i)
3424
        try:
2839.6.2 by Alexander Belchenko
changes after Martin's review
3425
            char.decode(encoding)
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
3426
        except UnicodeDecodeError:
3427
            return char
3428
    return None
2917.3.1 by Vincent Ladeuil
Separate transport from test server.
3429
3430
2929.3.10 by Vincent Ladeuil
Add a fake https server and test facilities.
3431
class _HTTPSServerFeature(Feature):
3432
    """Some tests want an https Server, check if one is available.
3433
2929.3.12 by Vincent Ladeuil
Implement an https server passing the same tests than http. Except
3434
    Right now, the only way this is available is under python2.6 which provides
3435
    an ssl module.
2929.3.10 by Vincent Ladeuil
Add a fake https server and test facilities.
3436
    """
3437
3438
    def _probe(self):
2929.3.12 by Vincent Ladeuil
Implement an https server passing the same tests than http. Except
3439
        try:
3440
            import ssl
3441
            return True
3442
        except ImportError:
3443
            return False
2929.3.10 by Vincent Ladeuil
Add a fake https server and test facilities.
3444
3445
    def feature_name(self):
3446
        return 'HTTPSServer'
3447
3448
3449
HTTPSServerFeature = _HTTPSServerFeature()
2929.3.14 by Vincent Ladeuil
Merge bzr.dev
3450
3451
3287.20.2 by John Arbash Meinel
Raise a clear error about the offending filename when there is a filename with bad characters.
3452
class _UnicodeFilename(Feature):
3453
    """Does the filesystem support Unicode filenames?"""
3454
3455
    def _probe(self):
3456
        try:
3457
            os.stat(u'\u03b1')
3458
        except UnicodeEncodeError:
3459
            return False
3460
        except (IOError, OSError):
3461
            # The filesystem allows the Unicode filename but the file doesn't
3462
            # exist.
3463
            return True
3464
        else:
3465
            # The filesystem allows the Unicode filename and the file exists,
3466
            # for some reason.
3467
            return True
3468
3469
UnicodeFilename = _UnicodeFilename()
3470
3471
3472
class _UTF8Filesystem(Feature):
3473
    """Is the filesystem UTF-8?"""
3474
3475
    def _probe(self):
3476
        if osutils._fs_enc.upper() in ('UTF-8', 'UTF8'):
3477
            return True
3478
        return False
3479
3480
UTF8Filesystem = _UTF8Filesystem()
3481
3482
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
3483
class _CaseInsCasePresFilenameFeature(Feature):
3484
    """Is the file-system case insensitive, but case-preserving?"""
3485
3486
    def _probe(self):
3487
        fileno, name = tempfile.mkstemp(prefix='MixedCase')
3488
        try:
3489
            # first check truly case-preserving for created files, then check
3490
            # case insensitive when opening existing files.
3491
            name = osutils.normpath(name)
3492
            base, rel = osutils.split(name)
3493
            found_rel = osutils.canonical_relpath(base, name)
3932.3.1 by Martin Pool
merge cicp patch, correct rest syntax and news typo
3494
            return (found_rel == rel
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
3495
                    and os.path.isfile(name.upper())
3496
                    and os.path.isfile(name.lower()))
3497
        finally:
3498
            os.close(fileno)
3499
            os.remove(name)
3500
3501
    def feature_name(self):
3502
        return "case-insensitive case-preserving filesystem"
3503
3504
CaseInsCasePresFilenameFeature = _CaseInsCasePresFilenameFeature()
3505
3506
3063.1.1 by Alexander Belchenko
Catch OSError 17 (file exists) in final phase of tree transform and show filename to user (#111758).
3507
class _CaseInsensitiveFilesystemFeature(Feature):
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
3508
    """Check if underlying filesystem is case-insensitive but *not* case
3509
    preserving.
3063.1.1 by Alexander Belchenko
Catch OSError 17 (file exists) in final phase of tree transform and show filename to user (#111758).
3510
    """
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
3511
    # Note that on Windows, Cygwin, MacOS etc, the file-systems are far
3512
    # more likely to be case preserving, so this case is rare.
3063.1.1 by Alexander Belchenko
Catch OSError 17 (file exists) in final phase of tree transform and show filename to user (#111758).
3513
3514
    def _probe(self):
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
3515
        if CaseInsCasePresFilenameFeature.available():
3516
            return False
3517
3063.1.1 by Alexander Belchenko
Catch OSError 17 (file exists) in final phase of tree transform and show filename to user (#111758).
3518
        if TestCaseWithMemoryTransport.TEST_ROOT is None:
3519
            root = osutils.mkdtemp(prefix='testbzr-', suffix='.tmp')
3520
            TestCaseWithMemoryTransport.TEST_ROOT = root
3521
        else:
3522
            root = TestCaseWithMemoryTransport.TEST_ROOT
3523
        tdir = osutils.mkdtemp(prefix='case-sensitive-probe-', suffix='',
3524
            dir=root)
3525
        name_a = osutils.pathjoin(tdir, 'a')
3526
        name_A = osutils.pathjoin(tdir, 'A')
3527
        os.mkdir(name_a)
3528
        result = osutils.isdir(name_A)
3529
        _rmtree_temp_dir(tdir)
3530
        return result
3531
3532
    def feature_name(self):
3533
        return 'case-insensitive filesystem'
3534
3535
CaseInsensitiveFilesystemFeature = _CaseInsensitiveFilesystemFeature()
4165.1.1 by Robert Collins
Add builtin subunit support.
3536
3537
3538
class _SubUnitFeature(Feature):
3539
    """Check if subunit is available."""
3540
3541
    def _probe(self):
3542
        try:
3543
            import subunit
3544
            return True
3545
        except ImportError:
3546
            return False
3547
3548
    def feature_name(self):
3549
        return 'subunit'
3550
3551
SubUnitFeature = _SubUnitFeature()
3552
# Only define SubUnitBzrRunner if subunit is available.
3553
try:
3554
    from subunit import TestProtocolClient
3555
    class SubUnitBzrRunner(TextTestRunner):
3556
        def run(self, test):
3557
            # undo out claim for testing which looks like a test start to subunit
3558
            self.stream.write("success: %s\n" % (osutils.realpath(sys.argv[0]),))
3559
            result = TestProtocolClient(self.stream)
3560
            test.run(result)
3561
            return result
3562
except ImportError:
3563
    pass