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