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