/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2220.2.11 by mbp at sourcefrog
Get tag tests working again, stored in the Branch
1
# Copyright (C) 2005, 2006, 2007 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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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
45
import unittest
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
46
import time
2485.6.5 by Martin Pool
Remove keep_output option
47
import warnings
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
48
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
49
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
50
from bzrlib import (
51
    bzrdir,
52
    debug,
53
    errors,
54
    memorytree,
55
    osutils,
56
    progress,
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
57
    ui,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
58
    urlutils,
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
59
    workingtree,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
60
    )
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
61
import bzrlib.branch
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
62
import bzrlib.commands
1551.12.28 by Aaron Bentley
Move bundle timestamp code to timestamp
63
import bzrlib.timestamp
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
64
import bzrlib.export
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
65
import bzrlib.inventory
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
66
import bzrlib.iterablefile
1553.5.19 by Martin Pool
Run lockdir doctests
67
import bzrlib.lockdir
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
68
try:
69
    import bzrlib.lsprof
70
except ImportError:
71
    # lsprof not available
72
    pass
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
73
from bzrlib.merge import merge_inner
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
74
import bzrlib.merge3
75
import bzrlib.osutils
76
import bzrlib.plugin
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
77
from bzrlib.revision import common_ancestor
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
78
import bzrlib.store
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
79
from bzrlib import symbol_versioning
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
80
from bzrlib.symbol_versioning import (
81
    deprecated_method,
82
    zero_eighteen,
2665.4.4 by Aaron Bentley
Update deprecation symbols
83
    zero_ninetyone,
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
84
    )
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
85
import bzrlib.trace
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
86
from bzrlib.transport import get_transport
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
87
import bzrlib.transport
1951.2.1 by Martin Pool
Change to using LocalURLServer for testing.
88
from bzrlib.transport.local import LocalURLServer
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
89
from bzrlib.transport.memory import MemoryServer
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
90
from bzrlib.transport.readonly import ReadonlyServer
2095.4.1 by Martin Pool
Better progress bars during tests
91
from bzrlib.trace import mutter, note
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
92
from bzrlib.tests import TestUtil
2004.1.25 by v.ladeuil+lp at free
Shuffle http related test code. Hopefully it ends up at the right place :)
93
from bzrlib.tests.HttpServer import HttpServer
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
94
from bzrlib.tests.TestUtil import (
95
                          TestSuite,
96
                          TestLoader,
97
                          )
1514 by Robert Collins
Unbreak self.build_tree_shape in tests.
98
from bzrlib.tests.treeshape import build_tree_contents
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.
99
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
100
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)
101
# Mark this python module as being part of the implementation
102
# of unittest: this gives us better tracebacks where the last
103
# shown frame is the test code, not our assertXYZ.
2598.5.7 by Aaron Bentley
Updates from review
104
__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)
105
1951.2.1 by Martin Pool
Change to using LocalURLServer for testing.
106
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.
107
855 by Martin Pool
- Patch from John to allow plugins to add their own tests.
108
MODULES_TO_TEST = []
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
109
MODULES_TO_DOCTEST = [
2729.1.2 by Martin Pool
Add new multiply_tests_from_modules to give a simpler interface to test scenarios
110
        bzrlib.timestamp,
111
        bzrlib.errors,
112
        bzrlib.export,
113
        bzrlib.inventory,
114
        bzrlib.iterablefile,
115
        bzrlib.lockdir,
116
        bzrlib.merge3,
117
        bzrlib.option,
118
        bzrlib.store,
119
        # quoted to avoid module-loading circularity
120
        'bzrlib.tests',
121
        ]
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
122
123
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
124
def packages_to_test():
1530.2.1 by Robert Collins
Start tests for api usage.
125
    """Return a list of packages to test.
126
127
    The packages are not globally imported so that import failures are
128
    triggered when running selftest, not when importing the command.
129
    """
130
    import bzrlib.doc
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
131
    import bzrlib.tests.blackbox
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
132
    import bzrlib.tests.branch_implementations
1534.4.39 by Robert Collins
Basic BzrDir support.
133
    import bzrlib.tests.bzrdir_implementations
2485.8.3 by v.ladeuil+lp at free
Change the file naming to clearly separate the command behavior
134
    import bzrlib.tests.commands
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
135
    import bzrlib.tests.interrepository_implementations
1563.2.12 by Robert Collins
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.
136
    import bzrlib.tests.interversionedfile_implementations
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
137
    import bzrlib.tests.intertree_implementations
2729.2.1 by Martin Pool
Start adding per-inventory tests
138
    import bzrlib.tests.inventory_implementations
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
139
    import bzrlib.tests.per_lock
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
140
    import bzrlib.tests.repository_implementations
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
141
    import bzrlib.tests.revisionstore_implementations
1852.6.1 by Robert Collins
Start tree implementation tests.
142
    import bzrlib.tests.tree_implementations
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
143
    import bzrlib.tests.workingtree_implementations
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
144
    return [
1530.2.1 by Robert Collins
Start tests for api usage.
145
            bzrlib.doc,
1551.2.6 by Aaron Bentley
Restored blackbox tests [recommit]
146
            bzrlib.tests.blackbox,
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
147
            bzrlib.tests.branch_implementations,
1534.4.39 by Robert Collins
Basic BzrDir support.
148
            bzrlib.tests.bzrdir_implementations,
2485.8.3 by v.ladeuil+lp at free
Change the file naming to clearly separate the command behavior
149
            bzrlib.tests.commands,
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
150
            bzrlib.tests.interrepository_implementations,
1563.2.12 by Robert Collins
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.
151
            bzrlib.tests.interversionedfile_implementations,
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
152
            bzrlib.tests.intertree_implementations,
2729.2.1 by Martin Pool
Start adding per-inventory tests
153
            bzrlib.tests.inventory_implementations,
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
154
            bzrlib.tests.per_lock,
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
155
            bzrlib.tests.repository_implementations,
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
156
            bzrlib.tests.revisionstore_implementations,
1852.6.1 by Robert Collins
Start tree implementation tests.
157
            bzrlib.tests.tree_implementations,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
158
            bzrlib.tests.workingtree_implementations,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
159
            ]
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
160
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
161
2095.4.1 by Martin Pool
Better progress bars during tests
162
class ExtendedTestResult(unittest._TextTestResult):
163
    """Accepts, reports and accumulates the results of running tests.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
164
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
165
    Compared to this unittest version this class adds support for
166
    profiling, benchmarking, stopping as soon as a test fails,  and
167
    skipping tests.  There are further-specialized subclasses for
168
    different types of display.
169
170
    When a test finishes, in whatever way, it calls one of the addSuccess,
171
    addFailure or addError classes.  These in turn may redirect to a more
172
    specific case for the special test results supported by our extended
173
    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
174
175
    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
176
    """
2095.4.1 by Martin Pool
Better progress bars during tests
177
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
178
    stop_early = False
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
179
    
2095.4.1 by Martin Pool
Better progress bars during tests
180
    def __init__(self, stream, descriptions, verbosity,
181
                 bench_history=None,
182
                 num_tests=None,
183
                 ):
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
184
        """Construct new TestResult.
185
186
        :param bench_history: Optionally, a writable file object to accumulate
187
            benchmark results.
188
        """
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
189
        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
190
        if bench_history is not None:
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
191
            from bzrlib.version import _get_bzr_source_tree
192
            src_tree = _get_bzr_source_tree()
193
            if src_tree:
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
194
                try:
195
                    revision_id = src_tree.get_parent_ids()[0]
196
                except IndexError:
197
                    # XXX: if this is a brand new tree, do the same as if there
198
                    # is no branch.
199
                    revision_id = ''
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
200
            else:
201
                # XXX: If there's no branch, what should we do?
202
                revision_id = ''
1819.1.4 by Jan Balster
save the revison id for every benchmark run in .perf-history
203
            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
204
        self._bench_history = bench_history
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
205
        self.ui = ui.ui_factory
2095.4.1 by Martin Pool
Better progress bars during tests
206
        self.num_tests = num_tests
207
        self.error_count = 0
208
        self.failure_count = 0
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
209
        self.known_failure_count = 0
2095.4.1 by Martin Pool
Better progress bars during tests
210
        self.skip_count = 0
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
211
        self.not_applicable_count = 0
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
212
        self.unsupported = {}
2095.4.1 by Martin Pool
Better progress bars during tests
213
        self.count = 0
214
        self._overall_start_time = time.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).
215
    
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
216
    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).
217
        """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
218
        return getattr(testCase, "_benchtime", 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).
219
    
220
    def _elapsedTestTimeString(self):
221
        """Return a time string for the overall time the current test has taken."""
222
        return self._formatTime(time.time() - self._start_time)
223
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
224
    def _testTimeString(self, testCase):
225
        benchmark_time = self._extractBenchmarkTime(testCase)
226
        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).
227
            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
228
                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).
229
                self._elapsedTestTimeString())
230
        else:
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
231
            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).
232
233
    def _formatTime(self, seconds):
234
        """Format seconds as milliseconds with leading spaces."""
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
235
        # some benchmarks can take thousands of seconds to run, so we need 8
236
        # places
237
        return "%8dms" % (1000 * seconds)
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
238
2095.4.1 by Martin Pool
Better progress bars during tests
239
    def _shortened_test_description(self, test):
240
        what = test.id()
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
241
        what = re.sub(r'^bzrlib\.(tests|benchmarks)\.', '', what)
2095.4.1 by Martin Pool
Better progress bars during tests
242
        return what
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
243
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
244
    def startTest(self, test):
245
        unittest.TestResult.startTest(self, test)
2095.4.1 by Martin Pool
Better progress bars during tests
246
        self.report_test_start(test)
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
247
        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).
248
        self._recordTestStartTime()
249
250
    def _recordTestStartTime(self):
251
        """Record that a test has started."""
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
252
        self._start_time = time.time()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
253
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
254
    def _cleanupLogFile(self, test):
255
        # We can only do this if we have one of our TestCases, not if
256
        # we have a doctest.
257
        setKeepLogfile = getattr(test, 'setKeepLogfile', None)
258
        if setKeepLogfile is not None:
259
            setKeepLogfile()
260
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
261
    def addError(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
262
        """Tell result that test finished with an error.
263
264
        Called from the TestCase run() method when the test
265
        fails with an unexpected error.
266
        """
267
        self._testConcluded(test)
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
268
        if isinstance(err[1], TestSkipped):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
269
            return self._addSkipped(test, err)
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
270
        elif isinstance(err[1], UnavailableFeature):
271
            return self.addNotSupported(test, err[1].args[0])
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
272
        else:
273
            unittest.TestResult.addError(self, test, err)
274
            self.error_count += 1
275
            self.report_error(test, err)
276
            if self.stop_early:
277
                self.stop()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
278
279
    def addFailure(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
280
        """Tell result that test failed.
281
282
        Called from the TestCase run() method when the test
283
        fails because e.g. an assert() method failed.
284
        """
285
        self._testConcluded(test)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
286
        if isinstance(err[1], KnownFailure):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
287
            return self._addKnownFailure(test, err)
288
        else:
289
            unittest.TestResult.addFailure(self, test, err)
290
            self.failure_count += 1
291
            self.report_failure(test, err)
292
            if self.stop_early:
293
                self.stop()
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
294
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
295
    def addSuccess(self, test):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
296
        """Tell result that test completed successfully.
297
298
        Called from the TestCase run()
299
        """
300
        self._testConcluded(test)
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
301
        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
302
            benchmark_time = self._extractBenchmarkTime(test)
303
            if benchmark_time is not None:
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
304
                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
305
                    self._formatTime(benchmark_time),
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
306
                    test.id()))
2095.4.1 by Martin Pool
Better progress bars during tests
307
        self.report_success(test)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
308
        unittest.TestResult.addSuccess(self, test)
309
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
310
    def _testConcluded(self, test):
311
        """Common code when a test has finished.
312
313
        Called regardless of whether it succeded, failed, etc.
314
        """
315
        self._cleanupLogFile(test)
316
317
    def _addKnownFailure(self, test, err):
318
        self.known_failure_count += 1
319
        self.report_known_failure(test, err)
320
321
    def addNotSupported(self, test, feature):
322
        """The test will not be run because of a missing feature.
323
        """
324
        # this can be called in two different ways: it may be that the
325
        # test started running, and then raised (through addError) 
326
        # UnavailableFeature.  Alternatively this method can be called
327
        # while probing for features before running the tests; in that
328
        # case we will see startTest and stopTest, but the test will never
329
        # actually run.
330
        self.unsupported.setdefault(str(feature), 0)
331
        self.unsupported[str(feature)] += 1
332
        self.report_unsupported(test, feature)
333
334
    def _addSkipped(self, test, skip_excinfo):
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
335
        if isinstance(skip_excinfo[1], TestNotApplicable):
336
            self.not_applicable_count += 1
337
            self.report_not_applicable(test, skip_excinfo)
338
        else:
339
            self.skip_count += 1
340
            self.report_skip(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.
341
        try:
342
            test.tearDown()
343
        except KeyboardInterrupt:
344
            raise
345
        except:
346
            self.addError(test, test.__exc_info())
347
        else:
348
            unittest.TestResult.addSuccess(self, test)
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
349
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
350
    def printErrorList(self, flavour, errors):
351
        for test, err in errors:
352
            self.stream.writeln(self.separator1)
2321.3.2 by Alexander Belchenko
numbered dirs: printErrorList show test number for NUMBERED_DIRS
353
            self.stream.write("%s: " % flavour)
354
            self.stream.writeln(self.getDescription(test))
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
355
            if getattr(test, '_get_log', None) is not None:
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
356
                print >>self.stream
357
                print >>self.stream, \
1530.1.3 by Robert Collins
transport implementations now tested consistently.
358
                        ('vvvv[log from %s]' % test.id()).ljust(78,'-')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
359
                print >>self.stream, test._get_log()
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
360
                print >>self.stream, \
1530.1.3 by Robert Collins
transport implementations now tested consistently.
361
                        ('^^^^[log from %s]' % test.id()).ljust(78,'-')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
362
            self.stream.writeln(self.separator2)
363
            self.stream.writeln("%s" % err)
364
2095.4.1 by Martin Pool
Better progress bars during tests
365
    def finished(self):
366
        pass
367
368
    def report_cleaning_up(self):
369
        pass
370
371
    def report_success(self, test):
372
        pass
373
2658.3.1 by Daniel Watkins
Added ExtendedTestResult.wasStrictlySuccessful.
374
    def wasStrictlySuccessful(self):
375
        if self.unsupported or self.known_failure_count:
376
            return False
377
        return self.wasSuccessful()
378
379
2095.4.1 by Martin Pool
Better progress bars during tests
380
class TextTestResult(ExtendedTestResult):
381
    """Displays progress and results of tests in text form"""
382
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
383
    def __init__(self, stream, descriptions, verbosity,
384
                 bench_history=None,
385
                 num_tests=None,
386
                 pb=None,
387
                 ):
388
        ExtendedTestResult.__init__(self, stream, descriptions, verbosity,
2598.4.1 by Martin Pool
Remove obsolete --clean-output, --keep-output, --numbered-dirs selftest options (thanks Alexander)
389
            bench_history, num_tests)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
390
        if pb is None:
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
391
            self.pb = self.ui.nested_progress_bar()
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
392
            self._supplied_pb = False
393
        else:
394
            self.pb = pb
395
            self._supplied_pb = True
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
396
        self.pb.show_pct = False
397
        self.pb.show_spinner = False
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
398
        self.pb.show_eta = False,
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
399
        self.pb.show_count = False
400
        self.pb.show_bar = False
401
2095.4.1 by Martin Pool
Better progress bars during tests
402
    def report_starting(self):
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
403
        self.pb.update('[test 0/%d] starting...' % (self.num_tests))
2095.4.1 by Martin Pool
Better progress bars during tests
404
405
    def _progress_prefix_text(self):
406
        a = '[%d' % self.count
407
        if self.num_tests is not None:
408
            a +='/%d' % self.num_tests
2095.4.3 by Martin Pool
Tweak test display a bit more
409
        a += ' in %ds' % (time.time() - self._overall_start_time)
2095.4.1 by Martin Pool
Better progress bars during tests
410
        if self.error_count:
411
            a += ', %d errors' % self.error_count
412
        if self.failure_count:
413
            a += ', %d failed' % self.failure_count
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
414
        if self.known_failure_count:
415
            a += ', %d known failures' % self.known_failure_count
2095.4.1 by Martin Pool
Better progress bars during tests
416
        if self.skip_count:
417
            a += ', %d skipped' % self.skip_count
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
418
        if self.unsupported:
419
            a += ', %d missing features' % len(self.unsupported)
2095.4.3 by Martin Pool
Tweak test display a bit more
420
        a += ']'
2095.4.1 by Martin Pool
Better progress bars during tests
421
        return a
422
423
    def report_test_start(self, test):
424
        self.count += 1
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
425
        self.pb.update(
2095.4.1 by Martin Pool
Better progress bars during tests
426
                self._progress_prefix_text()
427
                + ' ' 
428
                + self._shortened_test_description(test))
429
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
430
    def _test_description(self, test):
2598.4.1 by Martin Pool
Remove obsolete --clean-output, --keep-output, --numbered-dirs selftest options (thanks Alexander)
431
        return self._shortened_test_description(test)
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
432
2095.4.3 by Martin Pool
Tweak test display a bit more
433
    def report_error(self, test, err):
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.
434
        self.pb.note('ERROR: %s\n    %s\n', 
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
435
            self._test_description(test),
2095.4.3 by Martin Pool
Tweak test display a bit more
436
            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.
437
            )
2095.4.1 by Martin Pool
Better progress bars during tests
438
2095.4.3 by Martin Pool
Tweak test display a bit more
439
    def report_failure(self, test, err):
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.
440
        self.pb.note('FAIL: %s\n    %s\n', 
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
441
            self._test_description(test),
2095.4.3 by Martin Pool
Tweak test display a bit more
442
            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.
443
            )
2095.4.1 by Martin Pool
Better progress bars during tests
444
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
445
    def report_known_failure(self, test, err):
446
        self.pb.note('XFAIL: %s\n%s\n',
447
            self._test_description(test), err[1])
448
2095.4.1 by Martin Pool
Better progress bars during tests
449
    def report_skip(self, test, skip_excinfo):
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
450
        pass
451
452
    def report_not_applicable(self, test, skip_excinfo):
453
        pass
2095.4.1 by Martin Pool
Better progress bars during tests
454
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
455
    def report_unsupported(self, test, feature):
456
        """test cannot be run because feature is missing."""
457
                  
2095.4.1 by Martin Pool
Better progress bars during tests
458
    def report_cleaning_up(self):
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
459
        self.pb.update('cleaning up...')
2095.4.1 by Martin Pool
Better progress bars during tests
460
461
    def finished(self):
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
462
        if not self._supplied_pb:
463
            self.pb.finished()
2095.4.1 by Martin Pool
Better progress bars during tests
464
465
466
class VerboseTestResult(ExtendedTestResult):
467
    """Produce long output, with one line per test run plus times"""
468
469
    def _ellipsize_to_right(self, a_string, final_width):
470
        """Truncate and pad a string, keeping the right hand side"""
471
        if len(a_string) > final_width:
472
            result = '...' + a_string[3-final_width:]
473
        else:
474
            result = a_string
475
        return result.ljust(final_width)
476
477
    def report_starting(self):
478
        self.stream.write('running %d tests...\n' % self.num_tests)
479
480
    def report_test_start(self, test):
481
        self.count += 1
482
        name = self._shortened_test_description(test)
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
483
        # width needs space for 6 char status, plus 1 for slash, plus 2 10-char
484
        # numbers, plus a trailing blank
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
485
        # 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)
486
        self.stream.write(self._ellipsize_to_right(name,
487
                          osutils.terminal_width()-30))
2095.4.1 by Martin Pool
Better progress bars during tests
488
        self.stream.flush()
489
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
490
    def _error_summary(self, err):
491
        indent = ' ' * 4
492
        return '%s%s' % (indent, err[1])
493
2095.4.3 by Martin Pool
Tweak test display a bit more
494
    def report_error(self, test, err):
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
495
        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
496
                % (self._testTimeString(test),
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
497
                   self._error_summary(err)))
2095.4.1 by Martin Pool
Better progress bars during tests
498
2095.4.3 by Martin Pool
Tweak test display a bit more
499
    def report_failure(self, test, err):
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
500
        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
501
                % (self._testTimeString(test),
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
502
                   self._error_summary(err)))
2095.4.1 by Martin Pool
Better progress bars during tests
503
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
504
    def report_known_failure(self, test, err):
505
        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
506
                % (self._testTimeString(test),
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
507
                   self._error_summary(err)))
508
2095.4.1 by Martin Pool
Better progress bars during tests
509
    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
510
        self.stream.writeln('   OK %s' % self._testTimeString(test))
2095.4.1 by Martin Pool
Better progress bars during tests
511
        for bench_called, stats in getattr(test, '_benchcalls', []):
512
            self.stream.writeln('LSProf output for %s(%s, %s)' % bench_called)
513
            stats.pprint(file=self.stream)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
514
        # flush the stream so that we get smooth output. This verbose mode is
515
        # used to show the output in PQM.
2095.4.1 by Martin Pool
Better progress bars during tests
516
        self.stream.flush()
517
518
    def report_skip(self, test, skip_excinfo):
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
519
        self.stream.writeln(' SKIP %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
520
                % (self._testTimeString(test),
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
521
                   self._error_summary(skip_excinfo)))
2095.4.1 by Martin Pool
Better progress bars during tests
522
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
523
    def report_not_applicable(self, test, skip_excinfo):
524
        self.stream.writeln('  N/A %s\n%s'
525
                % (self._testTimeString(),
526
                   self._error_summary(skip_excinfo)))
527
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
528
    def report_unsupported(self, test, feature):
529
        """test cannot be run because feature is missing."""
530
        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
531
                %(self._testTimeString(test), feature))
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
532
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
533
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
534
class TextTestRunner(object):
1185.16.58 by mbp at sourcefrog
- run all selftests by default
535
    stop_on_failure = False
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
536
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
537
    def __init__(self,
538
                 stream=sys.stderr,
539
                 descriptions=0,
540
                 verbosity=1,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
541
                 bench_history=None,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
542
                 list_only=False
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
543
                 ):
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
544
        self.stream = unittest._WritelnDecorator(stream)
545
        self.descriptions = descriptions
546
        self.verbosity = verbosity
1819.1.2 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Add a benchmark output parameter to TextTestRunner.
547
        self._bench_history = bench_history
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
548
        self.list_only = list_only
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
549
550
    def run(self, test):
551
        "Run the given test case or test suite."
552
        startTime = time.time()
2095.4.1 by Martin Pool
Better progress bars during tests
553
        if self.verbosity == 1:
554
            result_class = TextTestResult
555
        elif self.verbosity >= 2:
556
            result_class = VerboseTestResult
557
        result = result_class(self.stream,
558
                              self.descriptions,
559
                              self.verbosity,
560
                              bench_history=self._bench_history,
561
                              num_tests=test.countTestCases(),
562
                              )
563
        result.stop_early = self.stop_on_failure
564
        result.report_starting()
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
565
        if self.list_only:
2394.2.2 by Ian Clatworthy
Add --randomize and update help
566
            if self.verbosity >= 2:
567
                self.stream.writeln("Listing tests only ...\n")
568
            run = 0
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
569
            for t in iter_suite_tests(test):
570
                self.stream.writeln("%s" % (t.id()))
2394.2.2 by Ian Clatworthy
Add --randomize and update help
571
                run += 1
572
            actionTaken = "Listed"
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
573
        else: 
574
            test.run(result)
2394.2.2 by Ian Clatworthy
Add --randomize and update help
575
            run = result.testsRun
576
            actionTaken = "Ran"
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
577
        stopTime = time.time()
578
        timeTaken = stopTime - startTime
579
        result.printErrors()
580
        self.stream.writeln(result.separator2)
2394.2.2 by Ian Clatworthy
Add --randomize and update help
581
        self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
582
                            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.
583
        self.stream.writeln()
584
        if not result.wasSuccessful():
585
            self.stream.write("FAILED (")
586
            failed, errored = map(len, (result.failures, result.errors))
587
            if failed:
588
                self.stream.write("failures=%d" % failed)
589
            if errored:
590
                if failed: self.stream.write(", ")
591
                self.stream.write("errors=%d" % errored)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
592
            if result.known_failure_count:
593
                if failed or errored: self.stream.write(", ")
594
                self.stream.write("known_failure_count=%d" %
595
                    result.known_failure_count)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
596
            self.stream.writeln(")")
597
        else:
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
598
            if result.known_failure_count:
599
                self.stream.writeln("OK (known_failures=%d)" %
600
                    result.known_failure_count)
601
            else:
602
                self.stream.writeln("OK")
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
603
        if result.skip_count > 0:
604
            skipped = result.skip_count
605
            self.stream.writeln('%d test%s skipped' %
606
                                (skipped, skipped != 1 and "s" or ""))
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
607
        if result.unsupported:
608
            for feature, count in sorted(result.unsupported.items()):
609
                self.stream.writeln("Missing feature '%s' skipped %d tests." %
610
                    (feature, count))
2095.4.1 by Martin Pool
Better progress bars during tests
611
        result.finished()
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
612
        return result
613
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
614
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
615
def iter_suite_tests(suite):
616
    """Return all tests in a suite, recursing through nested suites"""
617
    for item in suite._tests:
618
        if isinstance(item, unittest.TestCase):
619
            yield item
620
        elif isinstance(item, unittest.TestSuite):
621
            for r in iter_suite_tests(item):
622
                yield r
623
        else:
624
            raise Exception('unknown object %r inside test suite %r'
625
                            % (item, suite))
626
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
627
628
class TestSkipped(Exception):
629
    """Indicates that a test was intentionally skipped, rather than failing."""
630
631
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
632
class TestNotApplicable(TestSkipped):
633
    """A test is not applicable to the situation where it was run.
634
635
    This is only normally raised by parameterized tests, if they find that 
636
    the instance they're constructed upon does not support one aspect 
637
    of its interface.
638
    """
639
640
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
641
class KnownFailure(AssertionError):
642
    """Indicates that a test failed in a precisely expected manner.
643
644
    Such failures dont block the whole test suite from passing because they are
645
    indicators of partially completed code or of future work. We have an
646
    explicit error for them so that we can ensure that they are always visible:
647
    KnownFailures are always shown in the output of bzr selftest.
648
    """
649
650
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
651
class UnavailableFeature(Exception):
652
    """A feature required for this test was not available.
653
654
    The feature should be used to construct the exception.
655
    """
656
657
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
658
class CommandFailed(Exception):
659
    pass
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
660
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
661
662
class StringIOWrapper(object):
663
    """A wrapper around cStringIO which just adds an encoding attribute.
664
    
665
    Internally we can check sys.stdout to see what the output encoding
666
    should be. However, cStringIO has no encoding attribute that we can
667
    set. So we wrap it instead.
668
    """
669
    encoding='ascii'
670
    _cstring = None
671
672
    def __init__(self, s=None):
673
        if s is not None:
674
            self.__dict__['_cstring'] = StringIO(s)
675
        else:
676
            self.__dict__['_cstring'] = StringIO()
677
678
    def __getattr__(self, name, getattr=getattr):
679
        return getattr(self.__dict__['_cstring'], name)
680
681
    def __setattr__(self, name, val):
682
        if name == 'encoding':
683
            self.__dict__['encoding'] = val
684
        else:
685
            return setattr(self._cstring, name, val)
686
687
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
688
class TestUIFactory(ui.CLIUIFactory):
689
    """A UI Factory for testing.
690
691
    Hide the progress bar but emit note()s.
692
    Redirect stdin.
693
    Allows get_password to be tested without real tty attached.
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
694
    """
695
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
696
    def __init__(self,
697
                 stdout=None,
698
                 stderr=None,
699
                 stdin=None):
700
        super(TestUIFactory, self).__init__()
701
        if stdin is not None:
702
            # We use a StringIOWrapper to be able to test various
703
            # encodings, but the user is still responsible to
704
            # encode the string and to set the encoding attribute
705
            # of StringIOWrapper.
706
            self.stdin = StringIOWrapper(stdin)
707
        if stdout is None:
708
            self.stdout = sys.stdout
709
        else:
710
            self.stdout = stdout
711
        if stderr is None:
712
            self.stderr = sys.stderr
713
        else:
714
            self.stderr = stderr
715
716
    def clear(self):
717
        """See progress.ProgressBar.clear()."""
718
719
    def clear_term(self):
720
        """See progress.ProgressBar.clear_term()."""
721
722
    def clear_term(self):
723
        """See progress.ProgressBar.clear_term()."""
724
725
    def finished(self):
726
        """See progress.ProgressBar.finished()."""
727
728
    def note(self, fmt_string, *args, **kwargs):
729
        """See progress.ProgressBar.note()."""
730
        self.stdout.write((fmt_string + "\n") % args)
731
732
    def progress_bar(self):
733
        return self
734
735
    def nested_progress_bar(self):
736
        return self
737
738
    def update(self, message, count=None, total=None):
739
        """See progress.ProgressBar.update()."""
740
741
    def get_non_echoed_password(self, prompt):
742
        """Get password from stdin without trying to handle the echo mode"""
743
        if prompt:
2461.1.1 by Vincent Ladeuil
Fix 110204 by letting TestUIFactory encode password prompt.
744
            self.stdout.write(prompt.encode(self.stdout.encoding, 'replace'))
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
745
        password = self.stdin.readline()
746
        if not password:
747
            raise EOFError
748
        if password[-1] == '\n':
749
            password = password[:-1]
750
        return password
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
751
752
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
753
class TestCase(unittest.TestCase):
754
    """Base class for bzr unit tests.
755
    
756
    Tests that need access to disk resources should subclass 
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
757
    TestCaseInTempDir not TestCase.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
758
759
    Error and debug log messages are redirected from their usual
760
    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.
761
    retrieved by _get_log().  We use a real OS file, not an in-memory object,
762
    so that it can also capture file IO.  When the test completes this file
763
    is read into memory and removed from disk.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
764
       
765
    There are also convenience functions to invoke bzr's command-line
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
766
    routine, and to build and check bzr trees.
767
   
768
    In addition to the usual method of overriding tearDown(), this class also
769
    allows subclasses to register functions into the _cleanups list, which is
770
    run in order as the object is torn down.  It's less likely this will be
771
    accidentally overlooked.
772
    """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
773
1185.16.14 by Martin Pool
- make TestCase._get_log work even if setup was aborted
774
    _log_file_name = None
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
775
    _log_contents = ''
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
776
    _keep_log_file = False
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
777
    # record lsprof data when performing benchmark calls.
778
    _gather_lsprof_in_benchmarks = False
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
779
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
780
    def __init__(self, methodName='testMethod'):
781
        super(TestCase, self).__init__(methodName)
782
        self._cleanups = []
783
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
784
    def setUp(self):
785
        unittest.TestCase.setUp(self)
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
786
        self._cleanEnvironment()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
787
        bzrlib.trace.disable_default_logging()
2095.4.1 by Martin Pool
Better progress bars during tests
788
        self._silenceUI()
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
789
        self._startLogFile()
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
790
        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)
791
        self._benchtime = None
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
792
        self._clear_hooks()
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
793
        self._clear_debug_flags()
794
795
    def _clear_debug_flags(self):
796
        """Prevent externally set debug flags affecting tests.
797
        
798
        Tests that want to use debug flags can just set them in the
799
        debug_flags set during setup/teardown.
800
        """
2560.1.3 by Robert Collins
Allow 'from debug import debug_flags'
801
        self._preserved_debug_flags = set(debug.debug_flags)
802
        debug.debug_flags.clear()
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
803
        self.addCleanup(self._restore_debug_flags)
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
804
805
    def _clear_hooks(self):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
806
        # prevent hooks affecting tests
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
807
        import bzrlib.branch
808
        import bzrlib.smart.server
2370.4.1 by Robert Collins
New SmartServer hooks facility. There are two initial hooks documented
809
        self._preserved_hooks = {
2018.18.14 by Martin Pool
merge hpss again; restore incorrectly removed RemoteRepository.break_lock
810
            bzrlib.branch.Branch: bzrlib.branch.Branch.hooks,
811
            bzrlib.smart.server.SmartTCPServer: bzrlib.smart.server.SmartTCPServer.hooks,
2370.4.1 by Robert Collins
New SmartServer hooks facility. There are two initial hooks documented
812
            }
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
813
        self.addCleanup(self._restoreHooks)
2018.18.14 by Martin Pool
merge hpss again; restore incorrectly removed RemoteRepository.break_lock
814
        # reset all hooks to an empty instance of the appropriate type
2245.1.2 by Robert Collins
Remove the static DefaultHooks method from Branch, replacing it with a derived dict BranchHooks object, which is easier to use and provides a place to put the policy-checking add method discussed on list.
815
        bzrlib.branch.Branch.hooks = bzrlib.branch.BranchHooks()
2018.18.14 by Martin Pool
merge hpss again; restore incorrectly removed RemoteRepository.break_lock
816
        bzrlib.smart.server.SmartTCPServer.hooks = bzrlib.smart.server.SmartServerHooks()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
817
2095.4.1 by Martin Pool
Better progress bars during tests
818
    def _silenceUI(self):
819
        """Turn off UI for duration of test"""
820
        # 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.
821
        saved = ui.ui_factory
2095.4.1 by Martin Pool
Better progress bars during tests
822
        def _restore():
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
823
            ui.ui_factory = saved
824
        ui.ui_factory = ui.SilentUIFactory()
2095.4.1 by Martin Pool
Better progress bars during tests
825
        self.addCleanup(_restore)
826
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
827
    def _ndiff_strings(self, a, b):
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
828
        """Return ndiff between two strings containing lines.
829
        
830
        A trailing newline is added if missing to make the strings
831
        print properly."""
832
        if b and b[-1] != '\n':
833
            b += '\n'
834
        if a and a[-1] != '\n':
835
            a += '\n'
1185.16.21 by Martin Pool
- tweak diff shown by assertEqualDiff
836
        difflines = difflib.ndiff(a.splitlines(True),
837
                                  b.splitlines(True),
838
                                  linejunk=lambda x: False,
839
                                  charjunk=lambda x: False)
840
        return ''.join(difflines)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
841
2255.2.190 by Martin Pool
assertEqual can take an option message
842
    def assertEqual(self, a, b, message=''):
2360.1.2 by John Arbash Meinel
Add an overzealous test, for Unicode support of _iter_changes.
843
        try:
844
            if a == b:
845
                return
846
        except UnicodeError, e:
847
            # If we can't compare without getting a UnicodeError, then
848
            # obviously they are different
849
            mutter('UnicodeError: %s', e)
2255.2.190 by Martin Pool
assertEqual can take an option message
850
        if message:
851
            message += '\n'
852
        raise AssertionError("%snot equal:\na = %s\nb = %s\n"
853
            % (message,
2477.1.4 by Martin Pool
fix up indenting in pformat of inequalities displayed by test suite
854
               pformat(a), pformat(b)))
2255.2.185 by Martin Pool
assertEqual uses pformat to show results
855
856
    assertEquals = assertEqual
857
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.
858
    def assertEqualDiff(self, a, b, message=None):
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
859
        """Assert two texts are equal, if not raise an exception.
860
        
861
        This is intended for use with multi-line strings where it can 
862
        be hard to find the differences by eye.
863
        """
864
        # TODO: perhaps override assertEquals to call this for strings?
865
        if a == b:
866
            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.
867
        if message is None:
868
            message = "texts not equal:\n"
2555.3.3 by Martin Pool
Simple lock tracing in LockDir
869
        raise AssertionError(message +
870
                             self._ndiff_strings(a, b))
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
871
        
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.
872
    def assertEqualMode(self, mode, mode_test):
873
        self.assertEqual(mode, mode_test,
874
                         'mode mismatch %o != %o' % (mode, mode_test))
875
2474.1.68 by John Arbash Meinel
Review feedback from Martin, mostly documentation updates.
876
    def assertPositive(self, val):
877
        """Assert that val is greater than 0."""
878
        self.assertTrue(val > 0, 'expected a positive value, but got %s' % val)
879
880
    def assertNegative(self, val):
881
        """Assert that val is less than 0."""
882
        self.assertTrue(val < 0, 'expected a negative value, but got %s' % val)
883
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
884
    def assertStartsWith(self, s, prefix):
885
        if not s.startswith(prefix):
886
            raise AssertionError('string %r does not start with %r' % (s, prefix))
887
888
    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.
889
        """Asserts that s ends with suffix."""
890
        if not s.endswith(suffix):
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
891
            raise AssertionError('string %r does not end with %r' % (s, suffix))
1185.16.42 by Martin Pool
- Add assertContainsRe
892
893
    def assertContainsRe(self, haystack, needle_re):
894
        """Assert that a contains something matching a regular expression."""
895
        if not re.search(needle_re, haystack):
2555.3.1 by Martin Pool
Better messages from assertContainsRe
896
            if '\n' in haystack or len(haystack) > 60:
897
                # a long string, format it in a more readable way
898
                raise AssertionError(
899
                        'pattern "%s" not found in\n"""\\\n%s"""\n'
900
                        % (needle_re, haystack))
901
            else:
902
                raise AssertionError('pattern "%s" not found in "%s"'
903
                        % (needle_re, haystack))
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
904
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
905
    def assertNotContainsRe(self, haystack, needle_re):
906
        """Assert that a does not match a regular expression"""
907
        if re.search(needle_re, haystack):
908
            raise AssertionError('pattern "%s" found in "%s"'
909
                    % (needle_re, haystack))
910
1553.5.3 by Martin Pool
[patch] Rename TestCase.AssertSubset to assertSubset for consistency (Jan Hudec)
911
    def assertSubset(self, sublist, superlist):
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
912
        """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)
913
        missing = set(sublist) - set(superlist)
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
914
        if len(missing) > 0:
2695.1.4 by Martin Pool
Much faster assertSubset using sets, not O(n**2)
915
            raise AssertionError("value(s) %r not present in container %r" %
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
916
                                 (missing, superlist))
917
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
918
    def assertListRaises(self, excClass, func, *args, **kwargs):
919
        """Fail unless excClass is raised when the iterator from func is used.
920
        
921
        Many functions can return generators this makes sure
922
        to wrap them in a list() call to make sure the whole generator
923
        is run, and that the proper exception is raised.
924
        """
925
        try:
926
            list(func(*args, **kwargs))
927
        except excClass:
928
            return
929
        else:
930
            if getattr(excClass,'__name__', None) is not None:
931
                excName = excClass.__name__
932
            else:
933
                excName = str(excClass)
934
            raise self.failureException, "%s not raised" % excName
935
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
936
    def assertRaises(self, excClass, callableObj, *args, **kwargs):
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
937
        """Assert that a callable raises a particular exception.
938
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
939
        :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.
940
            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.
941
        :param callableObj: A callable, will be passed ``*args`` and
942
            ``**kwargs``.
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
943
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
944
        Returns the exception so that you can examine it.
945
        """
946
        try:
2399.1.10 by John Arbash Meinel
fix assertRaises to use the right parameter...
947
            callableObj(*args, **kwargs)
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
948
        except excClass, e:
949
            return e
950
        else:
951
            if getattr(excClass,'__name__', None) is not None:
952
                excName = excClass.__name__
953
            else:
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
954
                # probably a tuple
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
955
                excName = str(excClass)
956
            raise self.failureException, "%s not raised" % excName
957
2220.1.13 by Marius Kruger
Remove assertNone
958
    def assertIs(self, left, right, message=None):
1185.68.1 by Aaron Bentley
test transactions
959
        if not (left is right):
2220.1.13 by Marius Kruger
Remove assertNone
960
            if message is not None:
961
                raise AssertionError(message)
962
            else:
963
                raise AssertionError("%r is not %r." % (left, right))
964
965
    def assertIsNot(self, left, right, message=None):
966
        if (left is right):
967
            if message is not None:
968
                raise AssertionError(message)
969
            else:
970
                raise AssertionError("%r is %r." % (left, right))
2220.1.4 by Marius Kruger
* bzrlib/tests/__init__
971
1530.1.21 by Robert Collins
Review feedback fixes.
972
    def assertTransportMode(self, transport, path, mode):
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
973
        """Fail if a path does not have mode mode.
974
        
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
975
        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.
976
        """
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
977
        if not transport._can_roundtrip_unix_modebits():
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
978
            return
979
        path_stat = transport.stat(path)
980
        actual_mode = stat.S_IMODE(path_stat.st_mode)
981
        self.assertEqual(mode, actual_mode,
982
            'mode of %r incorrect (%o != %o)' % (path, mode, actual_mode))
983
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
984
    def assertIsInstance(self, obj, kls):
985
        """Fail if obj is not an instance of kls"""
986
        if not isinstance(obj, kls):
1666.1.6 by Robert Collins
Make knit the default format.
987
            self.fail("%r is an instance of %s rather than %s" % (
988
                obj, obj.__class__, kls))
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
989
1551.13.10 by Aaron Bentley
Changes from review (poolie)
990
    def expectFailure(self, reason, assertion, *args, **kwargs):
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
991
        """Invoke a test, expecting it to fail for the given reason.
992
1551.13.10 by Aaron Bentley
Changes from review (poolie)
993
        This is for assertions that ought to succeed, but currently fail.
1551.13.11 by Aaron Bentley
Update docs
994
        (The failure is *expected* but not *wanted*.)  Please be very precise
995
        about the failure you're expecting.  If a new bug is introduced,
996
        AssertionError should be raised, not KnownFailure.
997
998
        Frequently, expectFailure should be followed by an opposite assertion.
999
        See example below.
1551.13.10 by Aaron Bentley
Changes from review (poolie)
1000
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1001
        Intended to be used with a callable that raises AssertionError as the
1551.13.10 by Aaron Bentley
Changes from review (poolie)
1002
        'assertion' parameter.  args and kwargs are passed to the 'assertion'.
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1003
1004
        Raises KnownFailure if the test fails.  Raises AssertionError if the
1005
        test succeeds.
1006
1007
        example usage::
1551.13.11 by Aaron Bentley
Update docs
1008
1009
          self.expectFailure('Math is broken', self.assertNotEqual, 54,
1010
                             dynamic_val)
1011
          self.assertEqual(42, dynamic_val)
1012
1013
          This means that a dynamic_val of 54 will cause the test to raise
1014
          a KnownFailure.  Once math is fixed and the expectFailure is removed,
1015
          only a dynamic_val of 42 will allow the test to pass.  Anything other
1016
          than 54 or 42 will cause an AssertionError.
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1017
        """
1018
        try:
1551.13.10 by Aaron Bentley
Changes from review (poolie)
1019
            assertion(*args, **kwargs)
1551.13.9 by Aaron Bentley
Implement TestCase.expectFailure
1020
        except AssertionError:
1021
            raise KnownFailure(reason)
1022
        else:
1023
            self.fail('Unexpected success.  Should have failed: %s' % reason)
1024
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1025
    def _capture_warnings(self, a_callable, *args, **kwargs):
1026
        """A helper for callDeprecated and applyDeprecated.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1027
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1028
        :param a_callable: A callable to call.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1029
        :param args: The positional arguments for the callable
1030
        :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
1031
        :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.
1032
            a_callable(``*args``, ``**kwargs``).
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1033
        """
1034
        local_warnings = []
2067.3.3 by Martin Pool
merge bzr.dev and reconcile several changes, also some test fixes
1035
        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
1036
            # we've hooked into a deprecation specific callpath,
1037
            # only deprecations should getting sent via it.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1038
            self.assertEqual(cls, DeprecationWarning)
1039
            local_warnings.append(msg)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1040
        original_warning_method = symbol_versioning.warn
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1041
        symbol_versioning.set_warning_method(capture_warnings)
1042
        try:
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1043
            result = a_callable(*args, **kwargs)
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1044
        finally:
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1045
            symbol_versioning.set_warning_method(original_warning_method)
1046
        return (local_warnings, result)
1047
1048
    def applyDeprecated(self, deprecation_format, a_callable, *args, **kwargs):
1049
        """Call a deprecated callable without warning the user.
1050
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1051
        Note that this only captures warnings raised by symbol_versioning.warn,
1052
        not other callers that go direct to the warning module.
1053
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1054
        To test that a deprecated method raises an error, do something like
1055
        this::
1056
1057
        self.assertRaises(errors.ReservedId,
1058
            self.applyDeprecated, zero_ninetyone,
1059
                br.append_revision, 'current:')
1060
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1061
        :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.
1062
            should have been deprecated with. This is the same type as the
1063
            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
1064
            callable is not deprecated with this format, an assertion error
1065
            will be raised.
1066
        :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.
1067
            a regular function. It will be called with ``*args`` and
1068
            ``**kwargs``.
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1069
        :param args: The positional arguments for the callable
1070
        :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.
1071
        :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
1072
        """
1073
        call_warnings, result = self._capture_warnings(a_callable,
1074
            *args, **kwargs)
1075
        expected_first_warning = symbol_versioning.deprecation_string(
1076
            a_callable, deprecation_format)
1077
        if len(call_warnings) == 0:
2255.7.47 by Robert Collins
Improve applyDeprecated warning message.
1078
            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
1079
                a_callable)
1080
        self.assertEqual(expected_first_warning, call_warnings[0])
1081
        return result
1082
1083
    def callDeprecated(self, expected, callable, *args, **kwargs):
1084
        """Assert that a callable is deprecated in a particular way.
1085
1086
        This is a very precise test for unusual requirements. The 
1087
        applyDeprecated helper function is probably more suited for most tests
1088
        as it allows you to simply specify the deprecation format being used
1089
        and will ensure that that is issued for the function being called.
1090
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1091
        Note that this only captures warnings raised by symbol_versioning.warn,
1092
        not other callers that go direct to the warning module.
1093
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1094
        :param expected: a list of the deprecation warnings expected, in order
1095
        :param callable: The callable to call
1096
        :param args: The positional arguments for the callable
1097
        :param kwargs: The keyword arguments for the callable
1098
        """
1099
        call_warnings, result = self._capture_warnings(callable,
1100
            *args, **kwargs)
1101
        self.assertEqual(expected, call_warnings)
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1102
        return result
1103
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1104
    def _startLogFile(self):
1105
        """Send bzr and test log messages to a temporary file.
1106
1107
        The file is removed as the test is torn down.
1108
        """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1109
        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
1110
        self._log_file = os.fdopen(fileno, 'w+')
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.
1111
        self._log_nonce = bzrlib.trace.enable_test_log(self._log_file)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1112
        self._log_file_name = name
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1113
        self.addCleanup(self._finishLogFile)
1114
1115
    def _finishLogFile(self):
1116
        """Finished with the log file.
1117
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1118
        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.
1119
        """
1711.7.10 by John Arbash Meinel
Nothing to clean up if self._log_file is None
1120
        if self._log_file is None:
1121
            return
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.
1122
        bzrlib.trace.disable_test_log(self._log_nonce)
1185.16.122 by Martin Pool
[patch] Close test log file before deleting, needed on Windows
1123
        self._log_file.close()
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1124
        self._log_file = None
2024.2.9 by John Arbash Meinel
Bring back log deletions
1125
        if not self._keep_log_file:
1126
            os.remove(self._log_file_name)
1127
            self._log_file_name = None
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1128
1129
    def setKeepLogfile(self):
1130
        """Make the logfile not be deleted when _finishLogFile is called."""
1131
        self._keep_log_file = True
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1132
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1133
    def addCleanup(self, callable):
1134
        """Arrange to run a callable when this case is torn down.
1135
1136
        Callables are run in the reverse of the order they are registered, 
1137
        ie last-in first-out.
1138
        """
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1139
        if callable in self._cleanups:
1140
            raise ValueError("cleanup function %r already registered on %s" 
1141
                    % (callable, self))
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1142
        self._cleanups.append(callable)
1143
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1144
    def _cleanEnvironment(self):
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1145
        new_env = {
2055.1.2 by John Arbash Meinel
Clean up BZR_HOME in ENV for the test suite
1146
            'BZR_HOME': None, # Don't inherit BZR_HOME to all the tests.
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1147
            'HOME': os.getcwd(),
2309.2.6 by Alexander Belchenko
bzr now use Win32 API to determine Application Data location, and don't rely solely on $APPDATA
1148
            'APPDATA': None,  # bzr now use Win32 API and don't rely on APPDATA
1861.4.1 by Matthieu Moy
BZREMAIL renamed to BZR_EMAIL.
1149
            'BZR_EMAIL': None,
1912.2.1 by Adeodato Simó
Clear $BZREMAIL in tests, not only the newer $BZR_EMAIL, since the
1150
            'BZREMAIL': None, # may still be present in the environment
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1151
            'EMAIL': None,
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1152
            'BZR_PROGRESS_BAR': None,
2617.2.1 by Jelmer Vernooij
Sanitize SSH_AUTH_SOCK environment variable (#125955).
1153
            # SSH Agent
1154
            'SSH_AUTH_SOCK': None,
2167.3.6 by v.ladeuil+lp at free
Take John's comments into account and add more tests.
1155
            # Proxies
1156
            'http_proxy': None,
1157
            'HTTP_PROXY': None,
1158
            'https_proxy': None,
1159
            'HTTPS_PROXY': None,
1160
            'no_proxy': None,
1161
            'NO_PROXY': None,
1162
            'all_proxy': None,
1163
            'ALL_PROXY': None,
1164
            # Nobody cares about these ones AFAIK. So far at
1165
            # least. If you do (care), please update this comment
1166
            # -- vila 20061212
1167
            'ftp_proxy': None,
1168
            '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.
1169
            'BZR_REMOTE_PATH': None,
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1170
        }
1185.38.4 by John Arbash Meinel
Making old_env a private member
1171
        self.__old_env = {}
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1172
        self.addCleanup(self._restoreEnvironment)
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1173
        for name, value in new_env.iteritems():
1174
            self._captureVar(name, value)
1175
1176
    def _captureVar(self, name, newvalue):
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1177
        """Set an environment variable, and reset it when finished."""
1178
        self.__old_env[name] = osutils.set_or_unset_env(name, newvalue)
1185.38.2 by John Arbash Meinel
[patch] Aaron Bentley's HOME fix.
1179
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1180
    def _restore_debug_flags(self):
2560.1.3 by Robert Collins
Allow 'from debug import debug_flags'
1181
        debug.debug_flags.clear()
1182
        debug.debug_flags.update(self._preserved_debug_flags)
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1183
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1184
    def _restoreEnvironment(self):
1185.38.4 by John Arbash Meinel
Making old_env a private member
1185
        for name, value in self.__old_env.iteritems():
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1186
            osutils.set_or_unset_env(name, value)
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1187
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1188
    def _restoreHooks(self):
2370.4.1 by Robert Collins
New SmartServer hooks facility. There are two initial hooks documented
1189
        for klass, hooks in self._preserved_hooks.items():
1190
            setattr(klass, 'hooks', hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1191
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1192
    def knownFailure(self, reason):
1193
        """This test has failed for some known reason."""
1194
        raise KnownFailure(reason)
1195
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1196
    def run(self, result=None):
1197
        if result is None: result = self.defaultTestResult()
1198
        for feature in getattr(self, '_test_needs_features', []):
1199
            if not feature.available():
1200
                result.startTest(self)
1201
                if getattr(result, 'addNotSupported', None):
1202
                    result.addNotSupported(self, feature)
1203
                else:
1204
                    result.addSuccess(self)
1205
                result.stopTest(self)
1206
                return
1207
        return unittest.TestCase.run(self, result)
1208
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1209
    def tearDown(self):
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1210
        self._runCleanups()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1211
        unittest.TestCase.tearDown(self)
1212
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)
1213
    def time(self, callable, *args, **kwargs):
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1214
        """Run callable and accrue the time it takes to the benchmark time.
1215
        
1216
        If lsprofiling is enabled (i.e. by --lsprof-time to bzr selftest) then
1217
        this will cause lsprofile statistics to be gathered and stored in
1218
        self._benchcalls.
1219
        """
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)
1220
        if self._benchtime is None:
1221
            self._benchtime = 0
1222
        start = time.time()
1223
        try:
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1224
            if not self._gather_lsprof_in_benchmarks:
1225
                return callable(*args, **kwargs)
1226
            else:
1227
                # record this benchmark
1228
                ret, stats = bzrlib.lsprof.profile(callable, *args, **kwargs)
1229
                stats.sort()
1230
                self._benchcalls.append(((callable, args, kwargs), stats))
1231
                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)
1232
        finally:
1233
            self._benchtime += time.time() - start
1234
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1235
    def _runCleanups(self):
1236
        """Run registered cleanup functions. 
1237
1238
        This should only be called from TestCase.tearDown.
1239
        """
1541 by Martin Pool
doc
1240
        # TODO: Perhaps this should keep running cleanups even if 
1241
        # 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.
1242
1243
        # Actually pop the cleanups from the list so tearDown running
1244
        # twice is safe (this happens for skipped tests).
1245
        while self._cleanups:
1246
            self._cleanups.pop()()
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
1247
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1248
    def log(self, *args):
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
1249
        mutter(*args)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1250
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1251
    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.
1252
        """Get the log from bzrlib.trace calls from this test.
1253
1254
        :param keep_log_file: When True, if the log is still a file on disk
1255
            leave it as a file on disk. When False, if the log is still a file
1256
            on disk, the log file is deleted and the log preserved as
1257
            self._log_contents.
1258
        :return: A string containing the log.
1259
        """
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1260
        # flush the log file, to get all content
1261
        import bzrlib.trace
1262
        bzrlib.trace._trace_file.flush()
1263
        if self._log_contents:
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1264
            return self._log_contents
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1265
        if self._log_file_name is not None:
1266
            logfile = open(self._log_file_name)
1267
            try:
1268
                log_contents = logfile.read()
1269
            finally:
1270
                logfile.close()
1271
            if not keep_log_file:
1272
                self._log_contents = log_contents
2309.2.7 by Alexander Belchenko
Skip permission denied (on win32) during selftest cleanup
1273
                try:
1274
                    os.remove(self._log_file_name)
1275
                except OSError, e:
1276
                    if sys.platform == 'win32' and e.errno == errno.EACCES:
1277
                        print >>sys.stderr, ('Unable to delete log file '
1278
                                             ' %r' % self._log_file_name)
1279
                    else:
1280
                        raise
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1281
            return log_contents
1282
        else:
1283
            return "DELETED log file to reduce memory footprint"
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1284
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
1285
    @deprecated_method(zero_eighteen)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1286
    def capture(self, cmd, retcode=0):
1185.3.26 by Martin Pool
- remove remaining external executions of bzr
1287
        """Shortcut that splits cmd into words, runs, and returns stdout"""
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1288
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
1185.3.26 by Martin Pool
- remove remaining external executions of bzr
1289
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1290
    def requireFeature(self, feature):
1291
        """This test requires a specific feature is available.
1292
1293
        :raises UnavailableFeature: When feature is not available.
1294
        """
1295
        if not feature.available():
1296
            raise UnavailableFeature(feature)
1297
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
1298
    @deprecated_method(zero_eighteen)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1299
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None,
1300
                         working_dir=None):
1185.22.7 by Michael Ellerman
Fix error in run_bzr_captured() doco
1301
        """Invoke bzr and return (stdout, stderr).
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1302
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
1303
        Don't call this method, just use run_bzr() which is equivalent.
2552.2.1 by Vincent Ladeuil
apply martin patch
1304
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
1305
        :param argv: Arguments to invoke bzr.  This may be either a 
1306
            single string, in which case it is split by shlex into words, 
1307
            or a list of arguments.
1308
        :param retcode: Expected return code, or None for don't-care.
1309
        :param encoding: Encoding for sys.stdout and sys.stderr
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
1310
        :param stdin: A string to be used as stdin for the command.
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1311
        :param working_dir: Change to this directory before running
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1312
        """
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1313
        return self._run_bzr_autosplit(argv, retcode=retcode,
1314
                encoding=encoding, stdin=stdin, working_dir=working_dir,
1315
                )
1316
1317
    def _run_bzr_autosplit(self, args, retcode, encoding, stdin,
1318
            working_dir):
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1319
        """Run bazaar command line, splitting up a string command line."""
1320
        if isinstance(args, basestring):
1321
            args = list(shlex.split(args))
1322
        return self._run_bzr_core(args, retcode=retcode,
1323
                encoding=encoding, stdin=stdin, working_dir=working_dir,
1324
                )
1325
1326
    def _run_bzr_core(self, args, retcode, encoding, stdin,
1327
            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
1328
        if encoding is None:
1329
            encoding = bzrlib.user_encoding
1330
        stdout = StringIOWrapper()
1331
        stderr = StringIOWrapper()
1332
        stdout.encoding = encoding
1333
        stderr.encoding = encoding
1334
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1335
        self.log('run bzr: %r', args)
1185.43.5 by Martin Pool
Update log message quoting
1336
        # FIXME: don't call into logging here
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1337
        handler = logging.StreamHandler(stderr)
1338
        handler.setLevel(logging.INFO)
1339
        logger = logging.getLogger('')
1340
        logger.addHandler(handler)
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
1341
        old_ui_factory = ui.ui_factory
1342
        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
1343
1344
        cwd = None
1345
        if working_dir is not None:
1346
            cwd = osutils.getcwd()
1347
            os.chdir(working_dir)
1348
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1349
        try:
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1350
            result = self.apply_redirected(ui.ui_factory.stdin,
1351
                stdout, stderr,
1352
                bzrlib.commands.run_bzr_catch_errors,
1353
                args)
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1354
        finally:
1355
            logger.removeHandler(handler)
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
1356
            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
1357
            if cwd is not None:
1358
                os.chdir(cwd)
1685.1.69 by Wouter van Heyst
merge bzr.dev 1740
1359
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1360
        out = stdout.getvalue()
1361
        err = stderr.getvalue()
1362
        if out:
1185.85.72 by John Arbash Meinel
Fix some of the tests.
1363
            self.log('output:\n%r', out)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1364
        if err:
1185.85.72 by John Arbash Meinel
Fix some of the tests.
1365
            self.log('errors:\n%r', err)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1366
        if retcode is not None:
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
1367
            self.assertEquals(retcode, result,
1368
                              message='Unexpected return code')
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1369
        return out, err
1370
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
1371
    def run_bzr(self, *args, **kwargs):
1119 by Martin Pool
doc
1372
        """Invoke bzr, as if it were run from the command line.
1373
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1374
        The argument list should not include the bzr program name - the
1375
        first argument is normally the bzr command.  Arguments may be
1376
        passed in three ways:
1377
1378
        1- A list of strings, eg ["commit", "a"].  This is recommended
1379
        when the command contains whitespace or metacharacters, or 
1380
        is built up at run time.
1381
1382
        2- A single string, eg "add a".  This is the most convenient 
1383
        for hardcoded commands.
1384
1385
        3- Several varargs parameters, eg run_bzr("add", "a").  
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1386
        This is not recommended for new code.
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1387
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
1388
        This runs bzr through the interface that catches and reports
1389
        errors, and with logging set to something approximating the
1390
        default, so that error reporting can be checked.
1391
1119 by Martin Pool
doc
1392
        This should be the main method for tests that want to exercise the
1393
        overall behavior of the bzr application (rather than a unit test
1394
        or a functional test of the library.)
1395
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1396
        This sends the stdout/stderr results into the test's log,
1397
        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.
1398
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1399
        :keyword stdin: A string to be used as stdin for the command.
2399.1.17 by John Arbash Meinel
[merge] bzr.dev 2562
1400
        :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.
1401
            default 0.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1402
        :keyword working_dir: The directory to run the command in
2399.1.17 by John Arbash Meinel
[merge] bzr.dev 2562
1403
        :keyword error_regexes: A list of expected error messages.  If
1404
            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
1405
        """
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1406
        retcode = kwargs.pop('retcode', 0)
1185.85.8 by John Arbash Meinel
Adding wrapper for sys.stdout so we can set the output encoding. Adding tests that 'bzr log' handles multiple encodings properly
1407
        encoding = kwargs.pop('encoding', None)
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
1408
        stdin = kwargs.pop('stdin', None)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1409
        working_dir = kwargs.pop('working_dir', None)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
1410
        error_regexes = kwargs.pop('error_regexes', [])
2292.1.30 by Marius Kruger
* Minor text fixes.
1411
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
1412
        if kwargs:
2665.1.2 by Michael Hudson
as jam suggested, report all extra keywords
1413
            raise TypeError("run_bzr() got unexpected keyword arguments '%s'"
1414
                            % kwargs.keys())
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
1415
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1416
        if len(args) == 1:
1417
            if isinstance(args[0], (list, basestring)):
1418
                args = args[0]
1419
        else:
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
1420
            symbol_versioning.warn(zero_eighteen % "passing varargs to run_bzr",
1421
                                   DeprecationWarning, stacklevel=3)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
1422
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1423
        out, err = self._run_bzr_autosplit(args=args,
1424
            retcode=retcode,
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
1425
            encoding=encoding, stdin=stdin, working_dir=working_dir,
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1426
            )
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
1427
1428
        for regex in error_regexes:
1429
            self.assertContainsRe(err, regex)
1430
        return out, err
1431
1185.85.24 by John Arbash Meinel
Moved run_bzr_decode into TestCase
1432
    def run_bzr_decode(self, *args, **kwargs):
1963.2.1 by Robey Pointer
remove usage of has_key()
1433
        if 'encoding' in kwargs:
1185.85.24 by John Arbash Meinel
Moved run_bzr_decode into TestCase
1434
            encoding = kwargs['encoding']
1435
        else:
1436
            encoding = bzrlib.user_encoding
1437
        return self.run_bzr(*args, **kwargs)[0].decode(encoding)
1438
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.
1439
    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
1440
        """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.
1441
1442
        :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.
1443
            must each be found in the error output. The relative ordering
1444
            is not enforced.
1445
        :param args: command-line arguments for bzr
1446
        :param kwargs: Keyword arguments which are interpreted by run_bzr
1447
            This function changes the default value of retcode to be 3,
1448
            since in most cases this is run when you expect bzr to fail.
2581.1.1 by Martin Pool
Merge more runbzr cleanups
1449
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1450
        :return: (out, err) The actual output of running the command (in case
1451
            you want to do more inspection)
1452
1453
        Examples of use::
1454
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
1455
            # Make sure that commit is failing because there is nothing to do
1456
            self.run_bzr_error(['no changes to commit'],
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
1457
                               ['commit', '-m', 'my commit comment'])
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
1458
            # Make sure --strict is handling an unknown file, rather than
1459
            # giving us the 'nothing to do' error
1460
            self.build_tree(['unknown'])
1461
            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.
1462
                               ['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
1463
        """
1464
        kwargs.setdefault('retcode', 3)
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
1465
        kwargs['error_regexes'] = error_regexes
1466
        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
1467
        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.
1468
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1469
    def run_bzr_subprocess(self, *args, **kwargs):
1470
        """Run bzr in a subprocess for testing.
1471
1472
        This starts a new Python interpreter and runs bzr in there. 
1473
        This should only be used for tests that have a justifiable need for
1474
        this isolation: e.g. they are testing startup time, or signal
1475
        handling, or early startup code, etc.  Subprocess code can't be 
1476
        profiled or debugged so easily.
1752.1.7 by Aaron Bentley
Stop using shlex in run_bzr_subprocess
1477
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1478
        :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
1479
            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.
1480
        :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
1481
            variables. A value of None will unset the env variable.
1482
            The values must be strings. The change will only occur in the
1483
            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.
1484
        :keyword universal_newlines: Convert CRLF => LF
1485
        :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.
1486
            --no-plugins to ensure test reproducibility. Also, it is possible
2067.2.2 by John Arbash Meinel
Review comments from Robert
1487
            for system-wide plugins to create unexpected output on stderr,
1488
            which can cause unnecessary test failures.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1489
        """
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
1490
        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
1491
        working_dir = kwargs.get('working_dir', None)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1492
        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
1493
        if len(args) == 1:
1494
            if isinstance(args[0], list):
1495
                args = args[0]
1496
            elif isinstance(args[0], basestring):
1497
                args = list(shlex.split(args[0]))
1498
        else:
2665.4.4 by Aaron Bentley
Update deprecation symbols
1499
            symbol_versioning.warn(zero_ninetyone %
2665.4.2 by Aaron Bentley
Update from review
1500
                                   "passing varargs to run_bzr_subprocess",
2665.4.1 by Aaron Bentley
teach run_bzr_subprocess to accept either a list of strings or a string
1501
                                   DeprecationWarning, stacklevel=3)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1502
        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.
1503
                                            working_dir=working_dir,
1504
                                            allow_plugins=allow_plugins)
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1505
        # We distinguish between retcode=None and retcode not passed.
1506
        supplied_retcode = kwargs.get('retcode', 0)
1507
        return self.finish_bzr_subprocess(process, retcode=supplied_retcode,
1508
            universal_newlines=kwargs.get('universal_newlines', False),
1509
            process_args=args)
1510
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
1511
    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
1512
                             skip_if_plan_to_signal=False,
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1513
                             working_dir=None,
1514
                             allow_plugins=False):
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1515
        """Start bzr in a subprocess for testing.
1516
1517
        This starts a new Python interpreter and runs bzr in there.
1518
        This should only be used for tests that have a justifiable need for
1519
        this isolation: e.g. they are testing startup time, or signal
1520
        handling, or early startup code, etc.  Subprocess code can't be
1521
        profiled or debugged so easily.
1522
1523
        :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.
1524
            for example ``['--version']``.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1525
        :param env_changes: A dictionary which lists changes to environment
1526
            variables. A value of None will unset the env variable.
1527
            The values must be strings. The change will only occur in the
1528
            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.
1529
        :param skip_if_plan_to_signal: raise TestSkipped when true and os.kill
1530
            is not available.
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1531
        :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.
1532
1533
        :returns: Popen object for the started process.
1534
        """
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
1535
        if skip_if_plan_to_signal:
1536
            if not getattr(os, 'kill', None):
1537
                raise TestSkipped("os.kill not available.")
1538
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1539
        if env_changes is None:
1540
            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
1541
        old_env = {}
1542
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
1543
        def cleanup_environment():
1544
            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
1545
                old_env[env_var] = osutils.set_or_unset_env(env_var, value)
1546
1547
        def restore_environment():
1548
            for env_var, value in old_env.iteritems():
1549
                osutils.set_or_unset_env(env_var, value)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
1550
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
1551
        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
1552
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1553
        cwd = None
1554
        if working_dir is not None:
1555
            cwd = osutils.getcwd()
1556
            os.chdir(working_dir)
1557
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1558
        try:
1559
            # win32 subprocess doesn't support preexec_fn
1560
            # so we will avoid using it on all platforms, just to
1561
            # make sure the code path is used, and we don't break on win32
1562
            cleanup_environment()
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1563
            command = [sys.executable, bzr_path]
1564
            if not allow_plugins:
1565
                command.append('--no-plugins')
1566
            command.extend(process_args)
1567
            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
1568
        finally:
1569
            restore_environment()
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1570
            if cwd is not None:
1571
                os.chdir(cwd)
1572
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
1573
        return process
1574
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1575
    def _popen(self, *args, **kwargs):
1576
        """Place a call to Popen.
2067.2.2 by John Arbash Meinel
Review comments from Robert
1577
1578
        Allows tests to override this method to intercept the calls made to
1579
        Popen for introspection.
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1580
        """
1581
        return Popen(*args, **kwargs)
1582
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
1583
    def get_bzr_path(self):
2018.1.9 by Andrew Bennetts
Implement ParamikoVendor.connect_ssh
1584
        """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).
1585
        bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
1586
        if not os.path.isfile(bzr_path):
1587
            # We are probably installed. Assume sys.argv is the right file
1588
            bzr_path = sys.argv[0]
1589
        return bzr_path
1590
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1591
    def finish_bzr_subprocess(self, process, retcode=0, send_signal=None,
1592
                              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
1593
        """Finish the execution of process.
1594
1595
        :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.
1596
        :param retcode: The status code that is expected.  Defaults to 0.  If
1597
            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
1598
        :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.
1599
        :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
1600
        :returns: (stdout, stderr)
1601
        """
1602
        if send_signal is not None:
1603
            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.
1604
        out, err = process.communicate()
1605
1606
        if universal_newlines:
1607
            out = out.replace('\r\n', '\n')
1608
            err = err.replace('\r\n', '\n')
1609
1610
        if retcode is not None and retcode != process.returncode:
1611
            if process_args is None:
1612
                process_args = "(unknown args)"
1613
            mutter('Output of bzr %s:\n%s', process_args, out)
1614
            mutter('Error for bzr %s:\n%s', process_args, err)
1615
            self.fail('Command bzr %s failed with retcode %s != %s'
1616
                      % (process_args, retcode, process.returncode))
1617
        return [out, err]
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
1618
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1619
    def check_inventory_shape(self, inv, shape):
1291 by Martin Pool
- add test for moving files between directories
1620
        """Compare an inventory to a list of expected names.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1621
1622
        Fail if they are not precisely equal.
1623
        """
1624
        extras = []
1625
        shape = list(shape)             # copy
1626
        for path, ie in inv.entries():
1627
            name = path.replace('\\', '/')
2545.3.1 by James Westby
Fix detection of directory entries in the inventory.
1628
            if ie.kind == 'directory':
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1629
                name = name + '/'
1630
            if name in shape:
1631
                shape.remove(name)
1632
            else:
1633
                extras.append(name)
1634
        if shape:
1635
            self.fail("expected paths not found in inventory: %r" % shape)
1636
        if extras:
1637
            self.fail("unexpected paths found in inventory: %r" % extras)
1638
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1639
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
1640
                         a_callable=None, *args, **kwargs):
1641
        """Call callable with redirected std io pipes.
1642
1643
        Returns the return code."""
1644
        if not callable(a_callable):
1645
            raise ValueError("a_callable must be callable.")
1646
        if stdin is None:
1647
            stdin = StringIO("")
1648
        if stdout is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
1649
            if getattr(self, "_log_file", None) is not None:
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
1650
                stdout = self._log_file
1651
            else:
1652
                stdout = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1653
        if stderr is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
1654
            if getattr(self, "_log_file", None is not None):
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
1655
                stderr = self._log_file
1656
            else:
1657
                stderr = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1658
        real_stdin = sys.stdin
1659
        real_stdout = sys.stdout
1660
        real_stderr = sys.stderr
1661
        try:
1662
            sys.stdout = stdout
1663
            sys.stderr = stderr
1664
            sys.stdin = stdin
1160 by Martin Pool
- tiny refactoring
1665
            return a_callable(*args, **kwargs)
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1666
        finally:
1667
            sys.stdout = real_stdout
1668
            sys.stderr = real_stderr
1669
            sys.stdin = real_stdin
1670
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1671
    def reduceLockdirTimeout(self):
1672
        """Reduce the default lock timeout for the duration of the test, so that
1673
        if LockContention occurs during a test, it does so quickly.
1674
1675
        Tests that expect to provoke LockContention errors should call this.
1676
        """
1677
        orig_timeout = bzrlib.lockdir._DEFAULT_TIMEOUT_SECONDS
1678
        def resetTimeout():
1679
            bzrlib.lockdir._DEFAULT_TIMEOUT_SECONDS = orig_timeout
1680
        self.addCleanup(resetTimeout)
1681
        bzrlib.lockdir._DEFAULT_TIMEOUT_SECONDS = 0
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
1682
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1683
1684
class TestCaseWithMemoryTransport(TestCase):
1685
    """Common test class for tests that do not need disk resources.
1686
1687
    Tests that need disk resources should derive from TestCaseWithTransport.
1688
1689
    TestCaseWithMemoryTransport sets the TEST_ROOT variable for all bzr tests.
1690
1691
    For TestCaseWithMemoryTransport the test_home_dir is set to the name of
1692
    a directory which does not exist. This serves to help ensure test isolation
1693
    is preserved. test_dir is set to the TEST_ROOT, as is cwd, because they
1694
    must exist. However, TestCaseWithMemoryTransport does not offer local
1695
    file defaults for the transport in tests, nor does it obey the command line
1696
    override, so tests that accidentally write to the common directory should
1697
    be rare.
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
1698
1699
    :cvar TEST_ROOT: Directory containing all temporary directories, plus
1700
    a .bzr directory that stops us ascending higher into the filesystem.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1701
    """
1702
1703
    TEST_ROOT = None
1704
    _TEST_NAME = 'test'
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1705
1986.2.5 by Robert Collins
Unbreak transport tests.
1706
    def __init__(self, methodName='runTest'):
1707
        # allow test parameterisation after test construction and before test
1708
        # execution. Variables that the parameteriser sets need to be 
1709
        # ones that are not set by setUp, or setUp will trash them.
1710
        super(TestCaseWithMemoryTransport, self).__init__(methodName)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1711
        self.vfs_transport_factory = default_transport
1712
        self.transport_server = None
1986.2.5 by Robert Collins
Unbreak transport tests.
1713
        self.transport_readonly_server = None
2018.5.44 by Andrew Bennetts
Small changes to help a couple more tests pass.
1714
        self.__vfs_server = None
1986.2.5 by Robert Collins
Unbreak transport tests.
1715
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1716
    def get_transport(self, relpath=None):
1717
        """Return a writeable transport.
1718
1719
        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.
1720
        "self._test_root"
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1721
        
1722
        :param relpath: a path relative to the base url.
1723
        """
1724
        t = get_transport(self.get_url(relpath))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1725
        self.assertFalse(t.is_readonly())
1726
        return t
1727
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1728
    def get_readonly_transport(self, relpath=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1729
        """Return a readonly transport for the test scratch space
1730
        
1731
        This can be used to test that operations which should only need
1732
        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.
1733
1734
        :param relpath: a path relative to the base url.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1735
        """
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1736
        t = get_transport(self.get_readonly_url(relpath))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1737
        self.assertTrue(t.is_readonly())
1738
        return t
1739
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
1740
    def create_transport_readonly_server(self):
1741
        """Create a transport server from class defined at init.
1742
2145.1.1 by mbp at sourcefrog
merge urllib keepalive etc
1743
        This is mostly a hook for daughter classes.
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
1744
        """
1745
        return self.transport_readonly_server()
1746
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1747
    def get_readonly_server(self):
1748
        """Get the server instance for the readonly transport
1749
1750
        This is useful for some tests with specific servers to do diagnostics.
1751
        """
1752
        if self.__readonly_server is None:
1753
            if self.transport_readonly_server is None:
1754
                # readonly decorator requested
1755
                # bring up the server
1756
                self.__readonly_server = ReadonlyServer()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1757
                self.__readonly_server.setUp(self.get_vfs_only_server())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1758
            else:
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
1759
                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 :).
1760
                self.__readonly_server.setUp(self.get_vfs_only_server())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1761
            self.addCleanup(self.__readonly_server.tearDown)
1762
        return self.__readonly_server
1763
1764
    def get_readonly_url(self, relpath=None):
1765
        """Get a URL for the readonly transport.
1766
1767
        This will either be backed by '.' or a decorator to the transport 
1768
        used by self.get_url()
1769
        relpath provides for clients to get a path relative to the base url.
1770
        These should only be downwards relative, not upwards.
1771
        """
1772
        base = self.get_readonly_server().get_url()
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
1773
        return self._adjust_url(base, relpath)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1774
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1775
    def get_vfs_only_server(self):
2018.5.44 by Andrew Bennetts
Small changes to help a couple more tests pass.
1776
        """Get the vfs only read/write server instance.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1777
1778
        This is useful for some tests with specific servers that need
1779
        diagnostics.
1780
1781
        For TestCaseWithMemoryTransport this is always a MemoryServer, and there
1782
        is no means to override it.
1783
        """
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1784
        if self.__vfs_server is None:
1785
            self.__vfs_server = MemoryServer()
1786
            self.__vfs_server.setUp()
1787
            self.addCleanup(self.__vfs_server.tearDown)
1788
        return self.__vfs_server
1789
1790
    def get_server(self):
1791
        """Get the read/write server instance.
1792
1793
        This is useful for some tests with specific servers that need
1794
        diagnostics.
1795
1796
        This is built from the self.transport_server factory. If that is None,
1797
        then the self.get_vfs_server is returned.
1798
        """
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1799
        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.
1800
            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 :).
1801
                return self.get_vfs_only_server()
1802
            else:
1803
                # bring up a decorated means of access to the vfs only server.
1804
                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.
1805
                try:
1806
                    self.__server.setUp(self.get_vfs_only_server())
1807
                except TypeError, e:
1808
                    # This should never happen; the try:Except here is to assist
1809
                    # developers having to update code rather than seeing an
1810
                    # uninformative TypeError.
1811
                    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
1812
            self.addCleanup(self.__server.tearDown)
1813
        return self.__server
1814
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1815
    def _adjust_url(self, base, relpath):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1816
        """Get a URL (or maybe a path) for the readwrite transport.
1817
1818
        This will either be backed by '.' or to an equivalent non-file based
1819
        facility.
1820
        relpath provides for clients to get a path relative to the base url.
1821
        These should only be downwards relative, not upwards.
1822
        """
1823
        if relpath is not None and relpath != '.':
1824
            if not base.endswith('/'):
1825
                base = base + '/'
1826
            # XXX: Really base should be a url; we did after all call
1827
            # get_url()!  But sometimes it's just a path (from
1828
            # LocalAbspathServer), and it'd be wrong to append urlescaped data
1829
            # to a non-escaped local path.
1830
            if base.startswith('./') or base.startswith('/'):
1831
                base += relpath
1832
            else:
1833
                base += urlutils.escape(relpath)
1834
        return base
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1835
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1836
    def get_url(self, relpath=None):
1837
        """Get a URL (or maybe a path) for the readwrite transport.
1838
1839
        This will either be backed by '.' or to an equivalent non-file based
1840
        facility.
1841
        relpath provides for clients to get a path relative to the base url.
1842
        These should only be downwards relative, not upwards.
1843
        """
1844
        base = self.get_server().get_url()
1845
        return self._adjust_url(base, relpath)
1846
1847
    def get_vfs_only_url(self, relpath=None):
1848
        """Get a URL (or maybe a path for the plain old vfs transport.
1849
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
1850
        This will never be a smart protocol.  It always has all the
1851
        capabilities of the local filesystem, but it might actually be a
1852
        MemoryTransport or some other similar virtual filesystem.
1853
2399.1.16 by John Arbash Meinel
[merge] bzr.dev 2466
1854
        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
1855
        get_url and get_readonly_url.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1856
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1857
        :param relpath: provides for clients to get a path relative to the base
1858
            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.
1859
        :return: A URL
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
1860
        """
1861
        base = self.get_vfs_only_server().get_url()
1862
        return self._adjust_url(base, relpath)
1863
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1864
    def _make_test_root(self):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1865
        if TestCaseWithMemoryTransport.TEST_ROOT is not None:
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1866
            return
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
1867
        root = tempfile.mkdtemp(prefix='testbzr-', suffix='.tmp')
1868
        TestCaseWithMemoryTransport.TEST_ROOT = root
1869
        
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1870
        # make a fake bzr directory there to prevent any tests propagating
1871
        # up onto the source directory's real branch
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
1872
        bzrdir.BzrDir.create_standalone_workingtree(root)
1873
1874
        # The same directory is used by all tests, and we're not specifically
1875
        # told when all tests are finished.  This will do.
1876
        atexit.register(_rmtree_temp_dir, root)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1877
1878
    def makeAndChdirToTestDir(self):
1879
        """Create a temporary directories for this one test.
1880
        
1881
        This must set self.test_home_dir and self.test_dir and chdir to
1882
        self.test_dir.
1883
        
1884
        For TestCaseWithMemoryTransport we chdir to the TEST_ROOT for this test.
1885
        """
1886
        os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
1887
        self.test_dir = TestCaseWithMemoryTransport.TEST_ROOT
1888
        self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
1889
        
1890
    def make_branch(self, relpath, format=None):
1891
        """Create a branch on the transport at relpath."""
1892
        repo = self.make_repository(relpath, format=format)
1893
        return repo.bzrdir.create_branch()
1894
1895
    def make_bzrdir(self, relpath, format=None):
1896
        try:
1897
            # might be a relative or absolute path
1898
            maybe_a_url = self.get_url(relpath)
1899
            segments = maybe_a_url.rsplit('/', 1)
1900
            t = get_transport(maybe_a_url)
1901
            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()
1902
                t.ensure_base()
2230.3.22 by Aaron Bentley
Make test suite use format registry default, not BzrDir default
1903
            if format is None:
1904
                format = 'default'
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
1905
            if isinstance(format, basestring):
1906
                format = bzrdir.format_registry.make_bzrdir(format)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1907
            return format.initialize_on_transport(t)
1908
        except errors.UninitializableFormat:
1909
            raise TestSkipped("Format %s is not initializable." % format)
1910
1911
    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
1912
        """Create a repository on our default transport at relpath.
1913
        
1914
        Note that relpath must be a relative path, not a full url.
1915
        """
1916
        # FIXME: If you create a remoterepository this returns the underlying
1917
        # real format, which is incorrect.  Actually we should make sure that 
1918
        # RemoteBzrDir returns a RemoteRepository.
1919
        # maybe  mbp 20070410
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1920
        made_control = self.make_bzrdir(relpath, format=format)
1921
        return made_control.create_repository(shared=shared)
1922
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
1923
    def make_branch_and_memory_tree(self, relpath, format=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1924
        """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
1925
        b = self.make_branch(relpath, format=format)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1926
        return memorytree.MemoryTree.create_on_branch(b)
1927
1928
    def overrideEnvironmentForTesting(self):
1929
        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
1930
        os.environ['BZR_HOME'] = self.test_home_dir
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1931
        
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1932
    def setUp(self):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1933
        super(TestCaseWithMemoryTransport, self).setUp()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1934
        self._make_test_root()
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1935
        _currentdir = os.getcwdu()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1936
        def _leaveDirectory():
1937
            os.chdir(_currentdir)
1938
        self.addCleanup(_leaveDirectory)
1939
        self.makeAndChdirToTestDir()
1940
        self.overrideEnvironmentForTesting()
1941
        self.__readonly_server = None
1942
        self.__server = None
2381.1.3 by Robert Collins
Review feedback.
1943
        self.reduceLockdirTimeout()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1944
1945
     
1946
class TestCaseInTempDir(TestCaseWithMemoryTransport):
1947
    """Derived class that runs a test within a temporary directory.
1948
1949
    This is useful for tests that need to create a branch, etc.
1950
1951
    The directory is created in a slightly complex way: for each
1952
    Python invocation, a new temporary top-level directory is created.
1953
    All test cases create their own directory within that.  If the
1954
    tests complete successfully, the directory is removed.
1955
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
1956
    :ivar test_base_dir: The path of the top-level directory for this 
1957
    test, which contains a home directory and a work directory.
1958
1959
    :ivar test_home_dir: An initially empty directory under test_base_dir
1960
    which is used as $HOME for this test.
1961
1962
    :ivar test_dir: A directory under test_base_dir used as the current
1963
    directory when the test proper is run.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
1964
    """
1965
1966
    OVERRIDE_PYTHON = 'python'
1967
1968
    def check_file_contents(self, filename, expect):
1969
        self.log("check contents of file %s" % filename)
1970
        contents = file(filename, 'r').read()
1971
        if contents != expect:
1972
            self.log("expected: %r" % expect)
1973
            self.log("actually: %r" % contents)
1974
            self.fail("contents of %s not as expected" % filename)
1975
1976
    def makeAndChdirToTestDir(self):
1977
        """See TestCaseWithMemoryTransport.makeAndChdirToTestDir().
1978
        
1979
        For TestCaseInTempDir we create a temporary directory based on the test
1980
        name and then create two subdirs - test and home under it.
1981
        """
2485.6.7 by Martin Pool
Run exitfuncs explicitly before exiting
1982
        # create a directory within the top level test directory
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
1983
        candidate_dir = tempfile.mkdtemp(dir=self.TEST_ROOT)
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
1984
        # now create test and home directories within this dir
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
1985
        self.test_base_dir = candidate_dir
1986
        self.test_home_dir = self.test_base_dir + '/home'
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
1987
        os.mkdir(self.test_home_dir)
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
1988
        self.test_dir = self.test_base_dir + '/work'
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
1989
        os.mkdir(self.test_dir)
1990
        os.chdir(self.test_dir)
1991
        # put name of test inside
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
1992
        f = file(self.test_base_dir + '/name', 'w')
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
1993
        try:
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
1994
            f.write(self.id())
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
1995
        finally:
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
1996
            f.close()
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
1997
        self.addCleanup(self.deleteTestDir)
1998
1999
    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)
2000
        os.chdir(self.TEST_ROOT)
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2001
        _rmtree_temp_dir(self.test_base_dir)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2002
2193.2.1 by Alexander Belchenko
selftest: build tree for test with binary line-endings by default
2003
    def build_tree(self, shape, line_endings='binary', transport=None):
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2004
        """Build a test tree according to a pattern.
2005
2006
        shape is a sequence of file specifications.  If the final
2007
        character is '/', a directory is created.
2008
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
2009
        This assumes that all the elements in the tree being built are new.
2010
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2011
        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.
2012
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
2013
        :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.
2014
            in binary mode, exact contents are written in native mode, the
2015
            line endings match the default platform endings.
2016
        :param transport: A transport to write to, for building trees on VFS's.
2017
            If the transport is readonly or None, "." is opened automatically.
2018
        :return: None
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2019
        """
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
2020
        # It's OK to just create them using forward slashes on windows.
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2021
        if transport is None or transport.is_readonly():
1553.5.9 by Martin Pool
Add TestCaseWithTransport.get_transport and get_readonly_transport
2022
            transport = get_transport(".")
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2023
        for name in shape:
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
2024
            self.assert_(isinstance(name, basestring))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2025
            if name[-1] == '/':
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2026
                transport.mkdir(urlutils.escape(name[:-1]))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2027
            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
2028
                if line_endings == 'binary':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2029
                    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
2030
                elif line_endings == 'native':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2031
                    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
2032
                else:
2227.2.2 by v.ladeuil+lp at free
Cleanup.
2033
                    raise errors.BzrError(
2034
                        '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
2035
                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
2036
                transport.put_bytes_non_atomic(urlutils.escape(name), content)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2037
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
2038
    def build_tree_contents(self, shape):
1514 by Robert Collins
Unbreak self.build_tree_shape in tests.
2039
        build_tree_contents(shape)
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
2040
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
2041
    def assertFileEqual(self, content, path):
2042
        """Fail if path does not contain 'content'."""
2227.2.1 by v.ladeuil+lp at free
Small fixes to test suite in the hope that it will facilitate the
2043
        self.failUnlessExists(path)
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
2044
        f = file(path, 'rb')
2321.3.8 by Alexander Belchenko
Cleanup patch after John's review
2045
        try:
2046
            s = f.read()
2047
        finally:
2048
            f.close()
2321.3.5 by Alexander Belchenko
TestCase.assertFileEqual: separate open/read file operations
2049
        self.assertEqualDiff(content, s)
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
2050
2227.2.1 by v.ladeuil+lp at free
Small fixes to test suite in the hope that it will facilitate the
2051
    def failUnlessExists(self, path):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2052
        """Fail unless path or paths, which may be abs or relative, exist."""
2053
        if not isinstance(path, basestring):
2054
            for p in path:
2055
                self.failUnlessExists(p)
2056
        else:
2057
            self.failUnless(osutils.lexists(path),path+" does not exist")
2227.2.1 by v.ladeuil+lp at free
Small fixes to test suite in the hope that it will facilitate the
2058
2059
    def failIfExists(self, path):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2060
        """Fail if path or paths, which may be abs or relative, exist."""
2061
        if not isinstance(path, basestring):
2062
            for p in path:
2063
                self.failIfExists(p)
2064
        else:
2065
            self.failIf(osutils.lexists(path),path+" exists")
2066
2067
    def assertInWorkingTree(self,path,root_path='.',tree=None):
2068
        """Assert whether path or paths are in the WorkingTree"""
2069
        if tree is None:
2070
            tree = workingtree.WorkingTree.open(root_path)
2071
        if not isinstance(path, basestring):
2072
            for p in path:
2073
                self.assertInWorkingTree(p,tree=tree)
2074
        else:
2075
            self.assertIsNot(tree.path2id(path), None,
2076
                path+' not in working tree.')
2077
2078
    def assertNotInWorkingTree(self,path,root_path='.',tree=None):
2079
        """Assert whether path or paths are not in the WorkingTree"""
2080
        if tree is None:
2081
            tree = workingtree.WorkingTree.open(root_path)
2082
        if not isinstance(path, basestring):
2083
            for p in path:
2084
                self.assertNotInWorkingTree(p,tree=tree)
2085
        else:
2086
            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
2087
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2088
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2089
class TestCaseWithTransport(TestCaseInTempDir):
2090
    """A test case that provides get_url and get_readonly_url facilities.
2091
2092
    These back onto two transport servers, one for readonly access and one for
2093
    read write access.
2094
2095
    If no explicit class is provided for readonly access, a
2096
    ReadonlyTransportDecorator is used instead which allows the use of non disk
2097
    based read write transports.
2098
2099
    If an explicit class is provided for readonly access, that server and the 
2100
    readwrite one must both define get_url() as resolving to os.getcwd().
2101
    """
2102
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2103
    def get_vfs_only_server(self):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2104
        """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.
2105
2106
        This is useful for some tests with specific servers that need
2107
        diagnostics.
2108
        """
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2109
        if self.__vfs_server is None:
2110
            self.__vfs_server = self.vfs_transport_factory()
2111
            self.__vfs_server.setUp()
2112
            self.addCleanup(self.__vfs_server.tearDown)
2113
        return self.__vfs_server
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2114
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2115
    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.
2116
        """Create a branch on the transport and a tree locally.
2117
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
2118
        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.
2119
        the transport.  In that case if the vfs_transport_factory is
2120
        LocalURLServer the working tree is created in the local
2018.5.88 by Andrew Bennetts
Clarify make_branch_and_tree docstring a little.
2121
        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.
2122
        repository will also be accessed locally. Otherwise a lightweight
2123
        checkout is created and returned.
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
2124
2125
        :param format: The BzrDirFormat.
2126
        :returns: the WorkingTree.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2127
        """
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.
2128
        # TODO: always use the local disk path for the working tree,
2129
        # this obviously requires a format that supports branch references
2130
        # so check for that by checking bzrdir.BzrDirFormat.get_default_format()
2131
        # RBC 20060208
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2132
        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.
2133
        try:
2134
            return b.bzrdir.create_workingtree()
2135
        except errors.NotLocalUrl:
1910.14.1 by Andrew Bennetts
Fix to make_branch_and_tree's behavior when used with an sftp transport.
2136
            # 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.
2137
            # transport can't support them, then we keep the non-disk-backed
2138
            # 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.
2139
            if self.vfs_transport_factory is LocalURLServer:
2140
                # the branch is colocated on disk, we cannot create a checkout.
2141
                # hopefully callers will expect this.
2142
                local_controldir= bzrdir.BzrDir.open(self.get_vfs_only_url(relpath))
2143
                return local_controldir.create_workingtree()
2144
            else:
2145
                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.
2146
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
2147
    def assertIsDirectory(self, relpath, transport):
2148
        """Assert that relpath within transport is a directory.
2149
2150
        This may not be possible on all transports; in that case it propagates
2151
        a TransportNotPossible.
2152
        """
2153
        try:
2154
            mode = transport.stat(relpath).st_mode
2155
        except errors.NoSuchFile:
2156
            self.fail("path %s is not a directory; no such file"
2157
                      % (relpath))
2158
        if not stat.S_ISDIR(mode):
2159
            self.fail("path %s is not a directory; has mode %#o"
2160
                      % (relpath, mode))
2161
1852.13.18 by Robert Collins
Write top level acceptance test for dirstate.
2162
    def assertTreesEqual(self, left, right):
2163
        """Check that left and right have the same content and properties."""
2164
        # we use a tree delta to check for equality of the content, and we
2165
        # manually check for equality of other things such as the parents list.
2166
        self.assertEqual(left.get_parent_ids(), right.get_parent_ids())
2167
        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.
2168
        self.assertFalse(differences.has_changed(),
2169
            "Trees %r and %r are different: %r" % (left, right, differences))
1852.13.18 by Robert Collins
Write top level acceptance test for dirstate.
2170
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2171
    def setUp(self):
2172
        super(TestCaseWithTransport, self).setUp()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2173
        self.__vfs_server = None
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2174
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2175
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2176
class ChrootedTestCase(TestCaseWithTransport):
2177
    """A support class that provides readonly urls outside the local namespace.
2178
2179
    This is done by checking if self.transport_server is a MemoryServer. if it
2180
    is then we are chrooted already, if it is not then an HttpServer is used
2181
    for readonly urls.
2182
2183
    TODO RBC 20060127: make this an option to TestCaseWithTransport so it can
2184
                       be used without needed to redo it when a different 
2185
                       subclass is in use ?
2186
    """
2187
2188
    def setUp(self):
2189
        super(ChrootedTestCase, self).setUp()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2190
        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 :)
2191
            self.transport_readonly_server = HttpServer
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2192
2193
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2194
def filter_suite_by_re(suite, pattern, exclude_pattern=None,
2394.2.10 by Ian Clatworthy
another doc fix and whitespace fixes
2195
                       random_order=False):
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
2196
    """Create a test suite by filtering another one.
2197
    
2198
    :param suite:           the source suite
2199
    :param pattern:         pattern that names must match
2200
    :param exclude_pattern: pattern that names must not match, if any
2201
    :param random_order:    if True, tests in the new suite will be put in
2202
                            random order
2203
    :returns: the newly created suite
2204
    """ 
2205
    return sort_suite_by_re(suite, pattern, exclude_pattern,
2206
        random_order, False)
2207
2208
2209
def sort_suite_by_re(suite, pattern, exclude_pattern=None,
2394.2.10 by Ian Clatworthy
another doc fix and whitespace fixes
2210
                     random_order=False, append_rest=True):
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
2211
    """Create a test suite by sorting another one.
2212
    
2213
    :param suite:           the source suite
2214
    :param pattern:         pattern that names must match in order to go
2215
                            first in the new suite
2216
    :param exclude_pattern: pattern that names must not match, if any
2217
    :param random_order:    if True, tests in the new suite will be put in
2218
                            random order
2219
    :param append_rest:     if False, pattern is a strict filter and not
2220
                            just an ordering directive
2221
    :returns: the newly created suite
2222
    """ 
2213.2.1 by Martin Pool
Add selftest --first flag
2223
    first = []
2224
    second = []
2225
    filter_re = re.compile(pattern)
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2226
    if exclude_pattern is not None:
2227
        exclude_re = re.compile(exclude_pattern)
2213.2.1 by Martin Pool
Add selftest --first flag
2228
    for test in iter_suite_tests(suite):
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2229
        test_id = test.id()
2230
        if exclude_pattern is None or not exclude_re.search(test_id):
2231
            if filter_re.search(test_id):
2232
                first.append(test)
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2233
            elif append_rest:
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2234
                second.append(test)
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2235
    if random_order:
2236
        random.shuffle(first)
2237
        random.shuffle(second)
2213.2.1 by Martin Pool
Add selftest --first flag
2238
    return TestUtil.TestSuite(first + second)
2239
2240
1185.16.58 by mbp at sourcefrog
- run all selftests by default
2241
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
2242
              stop_on_failure=False,
2213.2.1 by Martin Pool
Add selftest --first flag
2243
              transport=None, lsprof_timed=None, bench_history=None,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2244
              matching_tests_first=None,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2245
              list_only=False,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2246
              random_seed=None,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
2247
              exclude_pattern=None,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
2248
              strict=False,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
2249
              ):
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2250
    TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
2251
    if verbose:
2252
        verbosity = 2
2253
    else:
2254
        verbosity = 1
2255
    runner = TextTestRunner(stream=sys.stdout,
2256
                            descriptions=0,
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
2257
                            verbosity=verbosity,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2258
                            bench_history=bench_history,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
2259
                            list_only=list_only,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2260
                            )
1185.16.58 by mbp at sourcefrog
- run all selftests by default
2261
    runner.stop_on_failure=stop_on_failure
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2262
    # Initialise the random number generator and display the seed used.
2263
    # We convert the seed to a long to make it reuseable across invocations.
2264
    random_order = False
2265
    if random_seed is not None:
2266
        random_order = True
2267
        if random_seed == "now":
2268
            random_seed = long(time.time())
2269
        else:
2270
            # Convert the seed to a long if we can
2271
            try:
2272
                random_seed = long(random_seed)
2273
            except:
2274
                pass
2275
        runner.stream.writeln("Randomizing test order using seed %s\n" %
2276
            (random_seed))
2277
        random.seed(random_seed)
2278
    # Customise the list of tests if requested
2279
    if pattern != '.*' or exclude_pattern is not None or random_order:
2213.2.1 by Martin Pool
Add selftest --first flag
2280
        if matching_tests_first:
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2281
            suite = sort_suite_by_re(suite, pattern, exclude_pattern,
2282
                random_order)
2213.2.1 by Martin Pool
Add selftest --first flag
2283
        else:
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2284
            suite = filter_suite_by_re(suite, pattern, exclude_pattern,
2285
                random_order)
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
2286
    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.
2287
2288
    if strict:
2289
        return result.wasStrictlySuccessful()
2290
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
2291
    return result.wasSuccessful()
2292
2293
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
2294
def selftest(verbose=False, pattern=".*", stop_on_failure=True,
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2295
             transport=None,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
2296
             test_suite_factory=None,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
2297
             lsprof_timed=None,
2213.2.1 by Martin Pool
Add selftest --first flag
2298
             bench_history=None,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2299
             matching_tests_first=None,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2300
             list_only=False,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2301
             random_seed=None,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
2302
             exclude_pattern=None,
2303
             strict=False,
2304
             ):
1204 by Martin Pool
doc
2305
    """Run the whole test suite under the enhanced runner"""
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
2306
    # XXX: Very ugly way to do this...
2307
    # Disable warning about old formats because we don't want it to disturb
2308
    # any blackbox tests.
2309
    from bzrlib import repository
2310
    repository._deprecation_warning_done = True
2311
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.
2312
    global default_transport
2313
    if transport is None:
2314
        transport = default_transport
2315
    old_transport = default_transport
2316
    default_transport = transport
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2317
    try:
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2318
        if test_suite_factory is None:
2319
            suite = test_suite()
2320
        else:
2321
            suite = test_suite_factory()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2322
        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
2323
                     stop_on_failure=stop_on_failure,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
2324
                     transport=transport,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
2325
                     lsprof_timed=lsprof_timed,
2213.2.1 by Martin Pool
Add selftest --first flag
2326
                     bench_history=bench_history,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2327
                     matching_tests_first=matching_tests_first,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2328
                     list_only=list_only,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2329
                     random_seed=random_seed,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
2330
                     exclude_pattern=exclude_pattern,
2331
                     strict=strict)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2332
    finally:
2333
        default_transport = old_transport
2334
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
2335
2336
def test_suite():
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2337
    """Build and return TestSuite for the whole of bzrlib.
2338
    
2339
    This function can be replaced if you need to change the default test
2340
    suite on a global basis, but it is not encouraged.
2341
    """
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
2342
    testmod_names = [
2613.1.2 by Martin Pool
Move bencode tests into util.tests
2343
                   'bzrlib.util.tests.test_bencode',
2474.1.57 by John Arbash Meinel
Move code around to refactor according to our pyrex extension design.
2344
                   'bzrlib.tests.test__dirstate_helpers',
1518 by Robert Collins
Merge from mbp.
2345
                   'bzrlib.tests.test_ancestry',
1551.9.17 by Aaron Bentley
Annotate for working trees across all parents
2346
                   '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
2347
                   '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.
2348
                   'bzrlib.tests.test_atomicfile',
1518 by Robert Collins
Merge from mbp.
2349
                   'bzrlib.tests.test_bad_files',
2350
                   'bzrlib.tests.test_branch',
2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
2351
                   'bzrlib.tests.test_branchbuilder',
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
2352
                   'bzrlib.tests.test_bugtracker',
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
2353
                   'bzrlib.tests.test_bundle',
1534.4.39 by Robert Collins
Basic BzrDir support.
2354
                   '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
2355
                   'bzrlib.tests.test_cache_utf8',
2172.1.3 by Aaron Bentley
Rename test_commands in the test suite
2356
                   '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
2357
                   'bzrlib.tests.test_commit',
2358
                   'bzrlib.tests.test_commit_merge',
2359
                   'bzrlib.tests.test_config',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2360
                   'bzrlib.tests.test_conflicts',
2475.4.1 by Martin Pool
Start adding CountedLock class to partially replace LockableFiles
2361
                   'bzrlib.tests.test_counted_lock',
1551.3.11 by Aaron Bentley
Merge from Robert
2362
                   'bzrlib.tests.test_decorators',
2225.1.1 by Aaron Bentley
Added revert change display, with tests
2363
                   'bzrlib.tests.test_delta',
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
2364
                   'bzrlib.tests.test_deprecated_graph',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2365
                   'bzrlib.tests.test_diff',
1852.13.6 by Robert Collins
start hooking in the prototype dirstate serialiser.
2366
                   'bzrlib.tests.test_dirstate',
2625.6.1 by Adeodato Simó
New EmailMessage class, façade around email.Message and MIMEMultipart.
2367
                   'bzrlib.tests.test_email_message',
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
2368
                   'bzrlib.tests.test_errors',
1185.80.5 by John Arbash Meinel
Changing the escaping just a little bit. Now we can handle unicode characters.
2369
                   'bzrlib.tests.test_escaped_store',
1731.2.16 by Aaron Bentley
Get extract working for standalone trees
2370
                   'bzrlib.tests.test_extract',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2371
                   'bzrlib.tests.test_fetch',
1752.5.4 by Andrew Bennetts
Merge from bzr.dev.
2372
                   'bzrlib.tests.test_ftp_transport',
2215.5.1 by Alexander Belchenko
Fix generation of rstx man page (problem with short names of options) and provide simple tests for future.
2373
                   'bzrlib.tests.test_generate_docs',
2116.4.1 by John Arbash Meinel
Update file and revision id generators.
2374
                   'bzrlib.tests.test_generate_ids',
2135.2.7 by Kent Gibson
Implement JAM's review suggestions.
2375
                   'bzrlib.tests.test_globbing',
1518 by Robert Collins
Merge from mbp.
2376
                   'bzrlib.tests.test_gpg',
2377
                   'bzrlib.tests.test_graph',
2378
                   'bzrlib.tests.test_hashcache',
2425.2.2 by Robert Collins
``bzr help`` now provides cross references to other help topics using the
2379
                   'bzrlib.tests.test_help',
2553.1.1 by Robert Collins
Give Hooks names.
2380
                   'bzrlib.tests.test_hooks',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2381
                   'bzrlib.tests.test_http',
1786.1.8 by John Arbash Meinel
[merge] Johan Rydberg test updates
2382
                   '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
2383
                   'bzrlib.tests.test_https_ca_bundle',
1518 by Robert Collins
Merge from mbp.
2384
                   'bzrlib.tests.test_identitymap',
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
2385
                   'bzrlib.tests.test_ignores',
2592.1.4 by Robert Collins
Create a GraphIndexBuilder.
2386
                   'bzrlib.tests.test_index',
2363.5.2 by Aaron Bentley
Implement layout description
2387
                   'bzrlib.tests.test_info',
1518 by Robert Collins
Merge from mbp.
2388
                   'bzrlib.tests.test_inv',
1563.2.4 by Robert Collins
First cut at including the knit implementation of versioned_file.
2389
                   'bzrlib.tests.test_knit',
1996.1.1 by John Arbash Meinel
Adding a ScopeReplacer class, which can replace itself on demand
2390
                   'bzrlib.tests.test_lazy_import',
2063.4.1 by John Arbash Meinel
bzrlib.lazy_regex.lazy_compile creates a proxy object around re.compile()
2391
                   'bzrlib.tests.test_lazy_regex',
1553.5.12 by Martin Pool
New LockDir locking mechanism
2392
                   'bzrlib.tests.test_lockdir',
1185.67.4 by Aaron Bentley
Throw if we try to write to a LockableFiles with no write lock
2393
                   'bzrlib.tests.test_lockable_files',
1518 by Robert Collins
Merge from mbp.
2394
                   'bzrlib.tests.test_log',
2493.2.3 by Ian Clatworthy
changes requested in jameinel's review incorporated
2395
                   'bzrlib.tests.test_lsprof',
2681.1.8 by Aaron Bentley
Add Thunderbird support to bzr send
2396
                   'bzrlib.tests.test_mail_client',
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
2397
                   'bzrlib.tests.test_memorytree',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2398
                   '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
2399
                   'bzrlib.tests.test_merge3',
1518 by Robert Collins
Merge from mbp.
2400
                   'bzrlib.tests.test_merge_core',
1551.12.2 by Aaron Bentley
Got directives round-tripping, with bundles and everything
2401
                   'bzrlib.tests.test_merge_directive',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2402
                   'bzrlib.tests.test_missing',
1518 by Robert Collins
Merge from mbp.
2403
                   'bzrlib.tests.test_msgeditor',
2520.4.2 by Aaron Bentley
Integrate mpdiff into bazaar
2404
                   'bzrlib.tests.test_multiparent',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
2405
                   'bzrlib.tests.test_nonascii',
1518 by Robert Collins
Merge from mbp.
2406
                   '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.
2407
                   'bzrlib.tests.test_osutils',
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
2408
                   'bzrlib.tests.test_osutils_encodings',
2617.4.2 by Robert Collins
Add FileCollection support class.
2409
                   'bzrlib.tests.test_pack',
1558.15.6 by Aaron Bentley
Added more tests
2410
                   'bzrlib.tests.test_patch',
1185.82.9 by John Arbash Meinel
Moving patches testing into main test suite.
2411
                   'bzrlib.tests.test_patches',
1185.58.1 by John Arbash Meinel
Added new permissions test (currently don't pass)
2412
                   'bzrlib.tests.test_permissions',
1515 by Robert Collins
* Plugins with the same name in different directories in the bzr plugin
2413
                   'bzrlib.tests.test_plugins',
1551.2.27 by Aaron Bentley
Got propogation under test
2414
                   'bzrlib.tests.test_progress',
1570.1.11 by Robert Collins
Make reconcile work with shared repositories.
2415
                   'bzrlib.tests.test_reconcile',
1911.4.3 by John Arbash Meinel
[merge] Adeodato Simó: change factory => registry
2416
                   'bzrlib.tests.test_registry',
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
2417
                   'bzrlib.tests.test_remote',
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2418
                   'bzrlib.tests.test_repository',
1551.8.15 by Aaron Bentley
bug #54172: handle new directories properly in revert
2419
                   '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
2420
                   'bzrlib.tests.test_revision',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2421
                   'bzrlib.tests.test_revisionnamespaces',
1773.2.1 by Robert Collins
Teach all trees about unknowns, conflicts and get_parent_ids.
2422
                   'bzrlib.tests.test_revisiontree',
1185.47.1 by Martin Pool
[broken] start converting basic_io to more rfc822-like format
2423
                   'bzrlib.tests.test_rio',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2424
                   'bzrlib.tests.test_sampler',
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
2425
                   'bzrlib.tests.test_selftest',
1185.33.89 by Martin Pool
[patch] add a selftest test that the setup build script works (Alexander Belchenko)
2426
                   '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.
2427
                   'bzrlib.tests.test_sftp_transport',
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
2428
                   '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
2429
                   'bzrlib.tests.test_smart_add',
1910.19.1 by Andrew Bennetts
Support bzr:// urls to work with the new RPC-based transport which will be used
2430
                   'bzrlib.tests.test_smart_transport',
2535.2.1 by Adeodato Simó
New SMTPConnection class, a reduced version of that in bzr-email.
2431
                   'bzrlib.tests.test_smtp_connection',
1522 by Robert Collins
Test for the number of uses of self.working_tree() in branch.py
2432
                   'bzrlib.tests.test_source',
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
2433
                   'bzrlib.tests.test_ssh_transport',
1551.6.19 by Aaron Bentley
Fix pending merge status on empty trees
2434
                   '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
2435
                   'bzrlib.tests.test_store',
2018.5.157 by Andrew Bennetts
Remove unnecessary trivial divergences from bzr.dev.
2436
                   'bzrlib.tests.test_strace',
1731.2.4 by Aaron Bentley
Ensure subsume works with Knit2 repos
2437
                   'bzrlib.tests.test_subsume',
1534.2.1 by Robert Collins
Implement deprecated_method
2438
                   'bzrlib.tests.test_symbol_versioning',
2220.2.11 by mbp at sourcefrog
Get tag tests working again, stored in the Branch
2439
                   'bzrlib.tests.test_tag',
1518 by Robert Collins
Merge from mbp.
2440
                   'bzrlib.tests.test_testament',
1558.15.1 by Aaron Bentley
Add text_file function
2441
                   'bzrlib.tests.test_textfile',
1551.6.7 by Aaron Bentley
Implemented two-way merge, refactored weave merge
2442
                   'bzrlib.tests.test_textmerge',
1551.12.29 by Aaron Bentley
Copy and extend patch date formatting code, add patch-date parsing
2443
                   'bzrlib.tests.test_timestamp',
1518 by Robert Collins
Merge from mbp.
2444
                   '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
2445
                   'bzrlib.tests.test_transactions',
1534.7.1 by Aaron Bentley
Got creation of a versioned file working
2446
                   '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
2447
                   'bzrlib.tests.test_transport',
1852.8.2 by Robert Collins
Add InterTree class to represent InterTree operations.
2448
                   'bzrlib.tests.test_tree',
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
2449
                   '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
2450
                   'bzrlib.tests.test_tsort',
1666.1.2 by Robert Collins
Fix race condition between end of stream and end of file with tuned_gzip.
2451
                   'bzrlib.tests.test_tuned_gzip',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2452
                   'bzrlib.tests.test_ui',
2453
                   'bzrlib.tests.test_upgrade',
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2454
                   'bzrlib.tests.test_urlutils',
1563.2.1 by Robert Collins
Merge in a variation of the versionedfile api from versioned-file.
2455
                   'bzrlib.tests.test_versionedfile',
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
2456
                   'bzrlib.tests.test_version',
2022.1.1 by John Arbash Meinel
[merge] version-info plugin, and cleanup for layout in bzr
2457
                   'bzrlib.tests.test_version_info',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2458
                   'bzrlib.tests.test_weave',
2459
                   'bzrlib.tests.test_whitebox',
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
2460
                   '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
2461
                   'bzrlib.tests.test_workingtree',
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
2462
                   'bzrlib.tests.test_workingtree_4',
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
2463
                   'bzrlib.tests.test_wsgi',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
2464
                   'bzrlib.tests.test_xml',
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
2465
                   ]
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2466
    test_transport_implementations = [
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
2467
        'bzrlib.tests.test_transport_implementations',
2468
        'bzrlib.tests.test_read_bundle',
2469
        ]
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
2470
    suite = TestUtil.TestSuite()
1707.2.2 by Robert Collins
Start on bench_add, an add benchtest.
2471
    loader = TestUtil.TestLoader()
1864.3.1 by John Arbash Meinel
Print out when a test fails in non verbose mode, run transport tests later
2472
    suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
2553.2.5 by Robert Collins
And overhaul TransportTestProviderAdapter too.
2473
    from bzrlib.tests.test_transport_implementations import TransportTestProviderAdapter
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2474
    adapter = TransportTestProviderAdapter()
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
2475
    adapt_modules(test_transport_implementations, adapter, loader, suite)
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
2476
    for package in packages_to_test():
2477
        suite.addTest(package.test_suite())
855 by Martin Pool
- Patch from John to allow plugins to add their own tests.
2478
    for m in MODULES_TO_TEST:
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
2479
        suite.addTest(loader.loadTestsFromModule(m))
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
2480
    for m in MODULES_TO_DOCTEST:
1996.3.5 by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again.
2481
        try:
2482
            suite.addTest(doctest.DocTestSuite(m))
2483
        except ValueError, e:
2484
            print '**failed to get doctest for: %s\n%s' %(m,e)
2485
            raise
1516 by Robert Collins
* bzrlib.plugin.all_plugins has been changed from an attribute to a
2486
    for name, plugin in bzrlib.plugin.all_plugins().items():
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
2487
        if getattr(plugin, 'test_suite', None) is not None:
1551.10.20 by Aaron Bentley
Selftest handles wacky plugin behavior
2488
            default_encoding = sys.getdefaultencoding()
2489
            try:
2490
                plugin_suite = plugin.test_suite()
2491
            except ImportError, e:
2492
                bzrlib.trace.warning(
2493
                    'Unable to test plugin "%s": %s', name, e)
2494
            else:
2495
                suite.addTest(plugin_suite)
2496
            if default_encoding != sys.getdefaultencoding():
2497
                bzrlib.trace.warning(
2498
                    'Plugin "%s" tried to reset default encoding to: %s', name,
2499
                    sys.getdefaultencoding())
2500
                reload(sys)
2501
                sys.setdefaultencoding(default_encoding)
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
2502
    return suite
764 by Martin Pool
- log messages from a particular test are printed if that test fails
2503
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
2504
2729.1.3 by Martin Pool
TestScenarioAdapter must be a list, not an iter
2505
def multiply_tests_from_modules(module_name_list, scenario_iter):
2729.1.2 by Martin Pool
Add new multiply_tests_from_modules to give a simpler interface to test scenarios
2506
    """Adapt all tests in some given modules to given scenarios.
2507
2508
    This is the recommended public interface for test parameterization.
2509
    Typically the test_suite() method for a per-implementation test
2510
    suite will call multiply_tests_from_modules and return the 
2511
    result.
2512
2513
    :param module_name_list: List of fully-qualified names of test
2514
        modules.
2729.1.3 by Martin Pool
TestScenarioAdapter must be a list, not an iter
2515
    :param scenario_iter: Iterable of pairs of (scenario_name, 
2729.1.2 by Martin Pool
Add new multiply_tests_from_modules to give a simpler interface to test scenarios
2516
        scenario_param_dict).
2517
2518
    This returns a new TestSuite containing the cross product of
2519
    all the tests in all the modules, each repeated for each scenario.
2520
    Each test is adapted by adding the scenario name at the end 
2521
    of its name, and updating the test object's __dict__ with the
2522
    scenario_param_dict.
2523
2524
    >>> r = multiply_tests_from_modules(
2525
    ...     ['bzrlib.tests.test_sampler'],
2526
    ...     [('one', dict(param=1)), 
2527
    ...      ('two', dict(param=2))])
2528
    >>> tests = list(iter_suite_tests(r))
2529
    >>> len(tests)
2530
    2
2531
    >>> tests[0].id()
2532
    'bzrlib.tests.test_sampler.DemoTest.test_nothing(one)'
2533
    >>> tests[0].param
2534
    1
2535
    >>> tests[1].param
2536
    2
2537
    """
2538
    loader = TestLoader()
2539
    suite = TestSuite()
2540
    adapter = TestScenarioApplier()
2729.1.3 by Martin Pool
TestScenarioAdapter must be a list, not an iter
2541
    adapter.scenarios = list(scenario_iter)
2729.1.2 by Martin Pool
Add new multiply_tests_from_modules to give a simpler interface to test scenarios
2542
    adapt_modules(module_name_list, adapter, loader, suite)
2543
    return suite
2544
2545
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
2546
def adapt_modules(mods_list, adapter, loader, suite):
2547
    """Adapt the modules in mods_list using adapter and add to suite."""
1707.2.2 by Robert Collins
Start on bench_add, an add benchtest.
2548
    for test in iter_suite_tests(loader.loadTestsFromModuleNames(mods_list)):
2549
        suite.addTests(adapter.adapt(test))
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
2550
2551
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
2552
def _rmtree_temp_dir(dirname):
2485.6.4 by Martin Pool
Move unicode handling code into _rmtree_temp_dir
2553
    # If LANG=C we probably have created some bogus paths
2554
    # which rmtree(unicode) will fail to delete
2555
    # so make sure we are using rmtree(str) to delete everything
2556
    # except on win32, where rmtree(str) will fail
2557
    # since it doesn't have the property of byte-stream paths
2558
    # (they are either ascii or mbcs)
2559
    if sys.platform == 'win32':
2560
        # make sure we are using the unicode win32 api
2561
        dirname = unicode(dirname)
2562
    else:
2563
        dirname = dirname.encode(sys.getfilesystemencoding())
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
2564
    try:
2565
        osutils.rmtree(dirname)
2566
    except OSError, e:
2567
        if sys.platform == 'win32' and e.errno == errno.EACCES:
2568
            print >>sys.stderr, ('Permission denied: '
2569
                                 'unable to remove testing dir '
2408.1.1 by Alexander Belchenko
fix error handler in _rmtree_temp_dir()
2570
                                 '%s' % os.path.basename(dirname))
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
2571
        else:
2572
            raise
2573
2574
2367.1.4 by Robert Collins
Add operating system Feature model to bzrlib.tests to allow writing tests
2575
class Feature(object):
2576
    """An operating system Feature."""
2577
2578
    def __init__(self):
2579
        self._available = None
2580
2581
    def available(self):
2582
        """Is the feature available?
2583
2584
        :return: True if the feature is available.
2585
        """
2586
        if self._available is None:
2587
            self._available = self._probe()
2588
        return self._available
2589
2590
    def _probe(self):
2591
        """Implement this method in concrete features.
2592
2593
        :return: True if the feature is available.
2594
        """
2595
        raise NotImplementedError
2596
2597
    def __str__(self):
2598
        if getattr(self, 'feature_name', None):
2599
            return self.feature_name()
2600
        return self.__class__.__name__
2553.2.3 by Robert Collins
Split out the common test scenario support from the repository implementation specific code.
2601
2602
2603
class TestScenarioApplier(object):
2604
    """A tool to apply scenarios to tests."""
2605
2606
    def adapt(self, test):
2607
        """Return a TestSuite containing a copy of test for each scenario."""
2608
        result = unittest.TestSuite()
2609
        for scenario in self.scenarios:
2610
            result.addTest(self.adapt_test_to_scenario(test, scenario))
2611
        return result
2612
2613
    def adapt_test_to_scenario(self, test, scenario):
2614
        """Copy test and apply scenario to it.
2615
2616
        :param test: A test to adapt.
2617
        :param scenario: A tuple describing the scenarion.
2618
            The first element of the tuple is the new test id.
2619
            The second element is a dict containing attributes to set on the
2620
            test.
2621
        :return: The adapted test.
2622
        """
2623
        from copy import deepcopy
2624
        new_test = deepcopy(test)
2625
        for name, value in scenario[1].items():
2626
            setattr(new_test, name, value)
2553.3.1 by Robert Collins
Remove unneeded inner function in adapt_test_to_scenario.
2627
        new_id = "%s(%s)" % (new_test.id(), scenario[0])
2628
        new_test.id = lambda: new_id
2553.2.3 by Robert Collins
Split out the common test scenario support from the repository implementation specific code.
2629
        return new_test