/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1553.5.19 by Martin Pool
Run lockdir doctests
1
# Copyright (C) 2005, 2006 by 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
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
36
import re
1752.1.1 by Aaron Bentley
Add run_bzr_external
37
import shlex
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
38
import stat
1752.1.1 by Aaron Bentley
Add run_bzr_external
39
from subprocess import Popen, PIPE
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
40
import sys
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
41
import tempfile
42
import unittest
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
43
import time
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
44
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
45
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
46
import bzrlib.branch
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.
47
import bzrlib.bzrdir as bzrdir
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
48
import bzrlib.commands
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
49
import bzrlib.bundle.serializer
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.
50
import bzrlib.errors as errors
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
51
import bzrlib.inventory
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
52
import bzrlib.iterablefile
1553.5.19 by Martin Pool
Run lockdir doctests
53
import bzrlib.lockdir
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
54
try:
55
    import bzrlib.lsprof
56
except ImportError:
57
    # lsprof not available
58
    pass
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
59
from bzrlib.merge import merge_inner
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
60
import bzrlib.merge3
61
import bzrlib.osutils
62
import bzrlib.osutils as osutils
63
import bzrlib.plugin
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
64
import bzrlib.progress as progress
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
65
from bzrlib.revision import common_ancestor
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
66
import bzrlib.store
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
67
import bzrlib.trace
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
68
from bzrlib.transport import get_transport
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
69
import bzrlib.transport
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.
70
from bzrlib.transport.local import LocalRelpathServer
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
71
from bzrlib.transport.readonly import ReadonlyServer
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
72
from bzrlib.trace import mutter
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
73
from bzrlib.tests import TestUtil
74
from bzrlib.tests.TestUtil import (
75
                          TestSuite,
76
                          TestLoader,
77
                          )
1514 by Robert Collins
Unbreak self.build_tree_shape in tests.
78
from bzrlib.tests.treeshape import build_tree_contents
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
79
import bzrlib.urlutils as urlutils
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.
80
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
81
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.
82
default_transport = LocalRelpathServer
83
855 by Martin Pool
- Patch from John to allow plugins to add their own tests.
84
MODULES_TO_TEST = []
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
85
MODULES_TO_DOCTEST = [
86
                      bzrlib.branch,
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
87
                      bzrlib.bundle.serializer,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
88
                      bzrlib.commands,
89
                      bzrlib.errors,
90
                      bzrlib.inventory,
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
91
                      bzrlib.iterablefile,
1553.5.19 by Martin Pool
Run lockdir doctests
92
                      bzrlib.lockdir,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
93
                      bzrlib.merge3,
1545.1.2 by Denys Duchier
order MODULES_TO_DOCTEST alphabetically
94
                      bzrlib.option,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
95
                      bzrlib.osutils,
1752.2.4 by Martin Pool
Refactor SFTP transport to allow code sharing with SSH.
96
                      bzrlib.store,
97
                      bzrlib.transport,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
98
                      ]
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
99
100
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
101
def packages_to_test():
1530.2.1 by Robert Collins
Start tests for api usage.
102
    """Return a list of packages to test.
103
104
    The packages are not globally imported so that import failures are
105
    triggered when running selftest, not when importing the command.
106
    """
107
    import bzrlib.doc
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
108
    import bzrlib.tests.blackbox
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
109
    import bzrlib.tests.branch_implementations
1534.4.39 by Robert Collins
Basic BzrDir support.
110
    import bzrlib.tests.bzrdir_implementations
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
111
    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.
112
    import bzrlib.tests.interversionedfile_implementations
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
113
    import bzrlib.tests.intertree_implementations
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
114
    import bzrlib.tests.repository_implementations
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
115
    import bzrlib.tests.revisionstore_implementations
1852.6.1 by Robert Collins
Start tree implementation tests.
116
    import bzrlib.tests.tree_implementations
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
117
    import bzrlib.tests.workingtree_implementations
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
118
    return [
1530.2.1 by Robert Collins
Start tests for api usage.
119
            bzrlib.doc,
1551.2.6 by Aaron Bentley
Restored blackbox tests [recommit]
120
            bzrlib.tests.blackbox,
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
121
            bzrlib.tests.branch_implementations,
1534.4.39 by Robert Collins
Basic BzrDir support.
122
            bzrlib.tests.bzrdir_implementations,
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
123
            bzrlib.tests.interrepository_implementations,
1563.2.12 by Robert Collins
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.
124
            bzrlib.tests.interversionedfile_implementations,
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
125
            bzrlib.tests.intertree_implementations,
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
126
            bzrlib.tests.repository_implementations,
1563.2.21 by Robert Collins
Smoke test for RevisionStore factories creating revision stores.
127
            bzrlib.tests.revisionstore_implementations,
1852.6.1 by Robert Collins
Start tree implementation tests.
128
            bzrlib.tests.tree_implementations,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
129
            bzrlib.tests.workingtree_implementations,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
130
            ]
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
131
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
132
133
class _MyResult(unittest._TextTestResult):
1185.43.2 by Martin Pool
Nicer display of verbose test results and progress
134
    """Custom TestResult.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
135
1185.33.54 by Martin Pool
[merge] test renames and other fixes (John)
136
    Shows output in a different format, including displaying runtime for tests.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
137
    """
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
138
    stop_early = False
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
139
    
140
    def __init__(self, stream, descriptions, verbosity, pb=None):
141
        unittest._TextTestResult.__init__(self, stream, descriptions, verbosity)
142
        self.pb = pb
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
143
    
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)
144
    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).
145
        """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)
146
        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).
147
    
148
    def _elapsedTestTimeString(self):
149
        """Return a time string for the overall time the current test has taken."""
150
        return self._formatTime(time.time() - self._start_time)
151
152
    def _testTimeString(self):
153
        if self._benchmarkTime is not None:
154
            return "%s/%s" % (
155
                self._formatTime(self._benchmarkTime),
156
                self._elapsedTestTimeString())
157
        else:
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)
158
            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).
159
160
    def _formatTime(self, seconds):
161
        """Format seconds as milliseconds with leading spaces."""
162
        return "%5dms" % (1000 * seconds)
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
163
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
164
    def _ellipsise_unimportant_words(self, a_string, final_width,
165
                                   keep_start=False):
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
166
        """Add ellipses (sp?) for overly long strings.
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
167
        
168
        :param keep_start: If true preserve the start of a_string rather
169
                           than the end of it.
170
        """
171
        if keep_start:
172
            if len(a_string) > final_width:
173
                result = a_string[:final_width-3] + '...'
174
            else:
175
                result = a_string
176
        else:
177
            if len(a_string) > final_width:
178
                result = '...' + a_string[3-final_width:]
179
            else:
180
                result = a_string
181
        return result.ljust(final_width)
182
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
183
    def startTest(self, test):
184
        unittest.TestResult.startTest(self, test)
1185.31.17 by John Arbash Meinel
Shorten test names in verbose mode in a logical way. Removed bzrlib.selftest prefix
185
        # In a short description, the important words are in
186
        # the beginning, but in an id, the important words are
187
        # at the end
1185.33.54 by Martin Pool
[merge] test renames and other fixes (John)
188
        SHOW_DESCRIPTIONS = False
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
189
190
        if not self.showAll and self.dots and self.pb is not None:
191
            final_width = 13
192
        else:
193
            final_width = osutils.terminal_width()
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
194
            final_width = final_width - 15 - 8
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
195
        what = None
196
        if SHOW_DESCRIPTIONS:
197
            what = test.shortDescription()
198
            if what:
199
                what = self._ellipsise_unimportant_words(what, final_width, keep_start=True)
200
        if what is None:
201
            what = test.id()
202
            if what.startswith('bzrlib.tests.'):
203
                what = what[13:]
204
            what = self._ellipsise_unimportant_words(what, final_width)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
205
        if self.showAll:
1185.33.60 by Martin Pool
Use full terminal width for verbose test output.
206
            self.stream.write(what)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
207
        elif self.dots and self.pb is not None:
208
            self.pb.update(what, self.testsRun - 1, None)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
209
        self.stream.flush()
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
210
        self._recordTestStartTime()
211
212
    def _recordTestStartTime(self):
213
        """Record that a test has started."""
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
214
        self._start_time = time.time()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
215
216
    def addError(self, test, err):
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
217
        if isinstance(err[1], TestSkipped):
218
            return self.addSkipped(test, err)    
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
219
        unittest.TestResult.addError(self, test, err)
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)
220
        self.extractBenchmarkTime(test)
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
221
        if self.showAll:
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
222
            self.stream.writeln("ERROR %s" % self._testTimeString())
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
223
        elif self.dots and self.pb is None:
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
224
            self.stream.write('E')
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
225
        elif self.dots:
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
226
            self.pb.update(self._ellipsise_unimportant_words('ERROR', 13), self.testsRun, None)
1864.3.1 by John Arbash Meinel
Print out when a test fails in non verbose mode, run transport tests later
227
            self.pb.note(self._ellipsise_unimportant_words(
228
                            test.id() + ': ERROR',
229
                            osutils.terminal_width()))
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
230
        self.stream.flush()
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
231
        if self.stop_early:
232
            self.stop()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
233
234
    def addFailure(self, test, err):
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
235
        unittest.TestResult.addFailure(self, test, err)
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)
236
        self.extractBenchmarkTime(test)
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
237
        if self.showAll:
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
238
            self.stream.writeln(" FAIL %s" % self._testTimeString())
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
239
        elif self.dots and self.pb is None:
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
240
            self.stream.write('F')
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
241
        elif self.dots:
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
242
            self.pb.update(self._ellipsise_unimportant_words('FAIL', 13), self.testsRun, None)
1864.3.1 by John Arbash Meinel
Print out when a test fails in non verbose mode, run transport tests later
243
            self.pb.note(self._ellipsise_unimportant_words(
244
                            test.id() + ': FAIL',
245
                            osutils.terminal_width()))
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
246
        self.stream.flush()
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
247
        if self.stop_early:
248
            self.stop()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
249
250
    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)
251
        self.extractBenchmarkTime(test)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
252
        if self.showAll:
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
253
            self.stream.writeln('   OK %s' % self._testTimeString())
1728.1.3 by Robert Collins
Guard benchcalls with a getattr, and update test_selftest for the new output.
254
            for bench_called, stats in getattr(test, '_benchcalls', []):
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
255
                self.stream.writeln('LSProf output for %s(%s, %s)' % bench_called)
256
                stats.pprint(file=self.stream)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
257
        elif self.dots and self.pb is None:
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
258
            self.stream.write('~')
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
259
        elif self.dots:
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
260
            self.pb.update(self._ellipsise_unimportant_words('OK', 13), self.testsRun, None)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
261
        self.stream.flush()
262
        unittest.TestResult.addSuccess(self, test)
263
1185.33.96 by Martin Pool
Fix up display of reasons why tests were skipped.
264
    def addSkipped(self, test, skip_excinfo):
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)
265
        self.extractBenchmarkTime(test)
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
266
        if self.showAll:
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
267
            print >>self.stream, ' SKIP %s' % self._testTimeString()
1185.33.96 by Martin Pool
Fix up display of reasons why tests were skipped.
268
            print >>self.stream, '     %s' % skip_excinfo[1]
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
269
        elif self.dots and self.pb is None:
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
270
            self.stream.write('S')
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
271
        elif self.dots:
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
272
            self.pb.update(self._ellipsise_unimportant_words('SKIP', 13), self.testsRun, None)
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
273
        self.stream.flush()
274
        # seems best to treat this as success from point-of-view of unittest
275
        # -- it actually does nothing so it barely matters :)
1711.7.9 by John Arbash Meinel
call tearDown() when tests are skipped
276
        try:
277
            test.tearDown()
278
        except KeyboardInterrupt:
279
            raise
280
        except:
281
            self.addError(test, test.__exc_info())
282
        else:
283
            unittest.TestResult.addSuccess(self, test)
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
284
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
285
    def printErrorList(self, flavour, errors):
286
        for test, err in errors:
287
            self.stream.writeln(self.separator1)
1530.1.3 by Robert Collins
transport implementations now tested consistently.
288
            self.stream.writeln("%s: %s" % (flavour, self.getDescription(test)))
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
289
            if getattr(test, '_get_log', None) is not None:
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
290
                print >>self.stream
291
                print >>self.stream, \
1530.1.3 by Robert Collins
transport implementations now tested consistently.
292
                        ('vvvv[log from %s]' % test.id()).ljust(78,'-')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
293
                print >>self.stream, test._get_log()
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
294
                print >>self.stream, \
1530.1.3 by Robert Collins
transport implementations now tested consistently.
295
                        ('^^^^[log from %s]' % test.id()).ljust(78,'-')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
296
            self.stream.writeln(self.separator2)
297
            self.stream.writeln("%s" % err)
298
299
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
300
class TextTestRunner(object):
1185.16.58 by mbp at sourcefrog
- run all selftests by default
301
    stop_on_failure = False
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
302
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
303
    def __init__(self,
304
                 stream=sys.stderr,
305
                 descriptions=0,
306
                 verbosity=1,
307
                 keep_output=False,
308
                 pb=None):
309
        self.stream = unittest._WritelnDecorator(stream)
310
        self.descriptions = descriptions
311
        self.verbosity = verbosity
312
        self.keep_output = keep_output
313
        self.pb = pb
314
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
315
    def _makeResult(self):
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
316
        result = _MyResult(self.stream,
317
                           self.descriptions,
318
                           self.verbosity,
319
                           pb=self.pb)
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
320
        result.stop_early = self.stop_on_failure
1185.16.58 by mbp at sourcefrog
- run all selftests by default
321
        return result
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
322
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
323
    def run(self, test):
324
        "Run the given test case or test suite."
325
        result = self._makeResult()
326
        startTime = time.time()
327
        if self.pb is not None:
328
            self.pb.update('Running tests', 0, test.countTestCases())
329
        test.run(result)
330
        stopTime = time.time()
331
        timeTaken = stopTime - startTime
332
        result.printErrors()
333
        self.stream.writeln(result.separator2)
334
        run = result.testsRun
335
        self.stream.writeln("Ran %d test%s in %.3fs" %
336
                            (run, run != 1 and "s" or "", timeTaken))
337
        self.stream.writeln()
338
        if not result.wasSuccessful():
339
            self.stream.write("FAILED (")
340
            failed, errored = map(len, (result.failures, result.errors))
341
            if failed:
342
                self.stream.write("failures=%d" % failed)
343
            if errored:
344
                if failed: self.stream.write(", ")
345
                self.stream.write("errors=%d" % errored)
346
            self.stream.writeln(")")
347
        else:
348
            self.stream.writeln("OK")
349
        if self.pb is not None:
350
            self.pb.update('Cleaning up', 0, 1)
351
        # This is still a little bogus, 
352
        # but only a little. Folk not using our testrunner will
353
        # have to delete their temp directories themselves.
1534.11.4 by Robert Collins
Merge from mainline.
354
        test_root = TestCaseInTempDir.TEST_ROOT
1534.11.6 by Robert Collins
Adjust test-of-tests to accomodate the global state of TEST_ROOT.
355
        if result.wasSuccessful() or not self.keep_output:
1534.11.4 by Robert Collins
Merge from mainline.
356
            if test_root is not None:
1685.1.80 by Wouter van Heyst
more code cleanup
357
                # If LANG=C we probably have created some bogus paths
358
                # which rmtree(unicode) will fail to delete
359
                # 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.
360
                # except on win32, where rmtree(str) will fail
361
                # since it doesn't have the property of byte-stream paths
362
                # (they are either ascii or mbcs)
363
                if sys.platform == 'win32':
364
                    # make sure we are using the unicode win32 api
365
                    test_root = unicode(test_root)
366
                else:
367
                    test_root = test_root.encode(
368
                        sys.getfilesystemencoding())
369
                osutils.rmtree(test_root)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
370
        else:
1534.11.6 by Robert Collins
Adjust test-of-tests to accomodate the global state of TEST_ROOT.
371
            if self.pb is not None:
372
                self.pb.note("Failed tests working directories are in '%s'\n",
373
                             test_root)
374
            else:
375
                self.stream.writeln(
376
                    "Failed tests working directories are in '%s'\n" %
377
                    test_root)
378
        TestCaseInTempDir.TEST_ROOT = None
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
379
        if self.pb is not None:
380
            self.pb.clear()
381
        return result
382
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
383
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
384
def iter_suite_tests(suite):
385
    """Return all tests in a suite, recursing through nested suites"""
386
    for item in suite._tests:
387
        if isinstance(item, unittest.TestCase):
388
            yield item
389
        elif isinstance(item, unittest.TestSuite):
390
            for r in iter_suite_tests(item):
391
                yield r
392
        else:
393
            raise Exception('unknown object %r inside test suite %r'
394
                            % (item, suite))
395
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
396
397
class TestSkipped(Exception):
398
    """Indicates that a test was intentionally skipped, rather than failing."""
399
    # XXX: Not used yet
400
401
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
402
class CommandFailed(Exception):
403
    pass
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
404
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
405
406
class StringIOWrapper(object):
407
    """A wrapper around cStringIO which just adds an encoding attribute.
408
    
409
    Internally we can check sys.stdout to see what the output encoding
410
    should be. However, cStringIO has no encoding attribute that we can
411
    set. So we wrap it instead.
412
    """
413
    encoding='ascii'
414
    _cstring = None
415
416
    def __init__(self, s=None):
417
        if s is not None:
418
            self.__dict__['_cstring'] = StringIO(s)
419
        else:
420
            self.__dict__['_cstring'] = StringIO()
421
422
    def __getattr__(self, name, getattr=getattr):
423
        return getattr(self.__dict__['_cstring'], name)
424
425
    def __setattr__(self, name, val):
426
        if name == 'encoding':
427
            self.__dict__['encoding'] = val
428
        else:
429
            return setattr(self._cstring, name, val)
430
431
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
432
class TestCase(unittest.TestCase):
433
    """Base class for bzr unit tests.
434
    
435
    Tests that need access to disk resources should subclass 
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
436
    TestCaseInTempDir not TestCase.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
437
438
    Error and debug log messages are redirected from their usual
439
    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.
440
    retrieved by _get_log().  We use a real OS file, not an in-memory object,
441
    so that it can also capture file IO.  When the test completes this file
442
    is read into memory and removed from disk.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
443
       
444
    There are also convenience functions to invoke bzr's command-line
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
445
    routine, and to build and check bzr trees.
446
   
447
    In addition to the usual method of overriding tearDown(), this class also
448
    allows subclasses to register functions into the _cleanups list, which is
449
    run in order as the object is torn down.  It's less likely this will be
450
    accidentally overlooked.
451
    """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
452
1185.16.14 by Martin Pool
- make TestCase._get_log work even if setup was aborted
453
    _log_file_name = None
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
454
    _log_contents = ''
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
455
    # record lsprof data when performing benchmark calls.
456
    _gather_lsprof_in_benchmarks = False
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
457
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
458
    def __init__(self, methodName='testMethod'):
459
        super(TestCase, self).__init__(methodName)
460
        self._cleanups = []
461
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
462
    def setUp(self):
463
        unittest.TestCase.setUp(self)
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
464
        self._cleanEnvironment()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
465
        bzrlib.trace.disable_default_logging()
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
466
        self._startLogFile()
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
467
        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)
468
        self._benchtime = None
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
469
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
470
    def _ndiff_strings(self, a, b):
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
471
        """Return ndiff between two strings containing lines.
472
        
473
        A trailing newline is added if missing to make the strings
474
        print properly."""
475
        if b and b[-1] != '\n':
476
            b += '\n'
477
        if a and a[-1] != '\n':
478
            a += '\n'
1185.16.21 by Martin Pool
- tweak diff shown by assertEqualDiff
479
        difflines = difflib.ndiff(a.splitlines(True),
480
                                  b.splitlines(True),
481
                                  linejunk=lambda x: False,
482
                                  charjunk=lambda x: False)
483
        return ''.join(difflines)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
484
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.
485
    def assertEqualDiff(self, a, b, message=None):
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
486
        """Assert two texts are equal, if not raise an exception.
487
        
488
        This is intended for use with multi-line strings where it can 
489
        be hard to find the differences by eye.
490
        """
491
        # TODO: perhaps override assertEquals to call this for strings?
492
        if a == b:
493
            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.
494
        if message is None:
495
            message = "texts not equal:\n"
496
        raise AssertionError(message + 
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
497
                             self._ndiff_strings(a, b))      
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
498
        
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.
499
    def assertEqualMode(self, mode, mode_test):
500
        self.assertEqual(mode, mode_test,
501
                         'mode mismatch %o != %o' % (mode, mode_test))
502
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
503
    def assertStartsWith(self, s, prefix):
504
        if not s.startswith(prefix):
505
            raise AssertionError('string %r does not start with %r' % (s, prefix))
506
507
    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.
508
        """Asserts that s ends with suffix."""
509
        if not s.endswith(suffix):
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
510
            raise AssertionError('string %r does not end with %r' % (s, suffix))
1185.16.42 by Martin Pool
- Add assertContainsRe
511
512
    def assertContainsRe(self, haystack, needle_re):
513
        """Assert that a contains something matching a regular expression."""
514
        if not re.search(needle_re, haystack):
515
            raise AssertionError('pattern "%s" not found in "%s"'
516
                    % (needle_re, haystack))
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
517
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
518
    def assertNotContainsRe(self, haystack, needle_re):
519
        """Assert that a does not match a regular expression"""
520
        if re.search(needle_re, haystack):
521
            raise AssertionError('pattern "%s" found in "%s"'
522
                    % (needle_re, haystack))
523
1553.5.3 by Martin Pool
[patch] Rename TestCase.AssertSubset to assertSubset for consistency (Jan Hudec)
524
    def assertSubset(self, sublist, superlist):
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
525
        """Assert that every entry in sublist is present in superlist."""
526
        missing = []
527
        for entry in sublist:
528
            if entry not in superlist:
529
                missing.append(entry)
530
        if len(missing) > 0:
531
            raise AssertionError("value(s) %r not present in container %r" % 
532
                                 (missing, superlist))
533
1185.68.1 by Aaron Bentley
test transactions
534
    def assertIs(self, left, right):
535
        if not (left is right):
536
            raise AssertionError("%r is not %r." % (left, right))
537
1530.1.21 by Robert Collins
Review feedback fixes.
538
    def assertTransportMode(self, transport, path, mode):
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
539
        """Fail if a path does not have mode mode.
540
        
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
541
        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.
542
        """
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
543
        if not transport._can_roundtrip_unix_modebits():
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
544
            return
545
        path_stat = transport.stat(path)
546
        actual_mode = stat.S_IMODE(path_stat.st_mode)
547
        self.assertEqual(mode, actual_mode,
548
            'mode of %r incorrect (%o != %o)' % (path, mode, actual_mode))
549
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
550
    def assertIsInstance(self, obj, kls):
551
        """Fail if obj is not an instance of kls"""
552
        if not isinstance(obj, kls):
1666.1.6 by Robert Collins
Make knit the default format.
553
            self.fail("%r is an instance of %s rather than %s" % (
554
                obj, obj.__class__, kls))
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
555
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
556
    def _startLogFile(self):
557
        """Send bzr and test log messages to a temporary file.
558
559
        The file is removed as the test is torn down.
560
        """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
561
        fileno, name = tempfile.mkstemp(suffix='.log', prefix='testbzr')
1185.52.1 by James Henstridge
Don't encode unicode messages to UTF-8 in mutter() (the stream writer does it).
562
        encoder, decoder, stream_reader, stream_writer = codecs.lookup('UTF-8')
563
        self._log_file = stream_writer(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.
564
        self._log_nonce = bzrlib.trace.enable_test_log(self._log_file)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
565
        self._log_file_name = name
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
566
        self.addCleanup(self._finishLogFile)
567
568
    def _finishLogFile(self):
569
        """Finished with the log file.
570
571
        Read contents into memory, close, and delete.
572
        """
1711.7.10 by John Arbash Meinel
Nothing to clean up if self._log_file is None
573
        if self._log_file is None:
574
            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.
575
        bzrlib.trace.disable_test_log(self._log_nonce)
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
576
        self._log_file.seek(0)
577
        self._log_contents = self._log_file.read()
1185.16.122 by Martin Pool
[patch] Close test log file before deleting, needed on Windows
578
        self._log_file.close()
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
579
        os.remove(self._log_file_name)
580
        self._log_file = self._log_file_name = None
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
581
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
582
    def addCleanup(self, callable):
583
        """Arrange to run a callable when this case is torn down.
584
585
        Callables are run in the reverse of the order they are registered, 
586
        ie last-in first-out.
587
        """
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
588
        if callable in self._cleanups:
589
            raise ValueError("cleanup function %r already registered on %s" 
590
                    % (callable, self))
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
591
        self._cleanups.append(callable)
592
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
593
    def _cleanEnvironment(self):
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
594
        new_env = {
595
            'HOME': os.getcwd(),
596
            'APPDATA': os.getcwd(),
1861.4.1 by Matthieu Moy
BZREMAIL renamed to BZR_EMAIL.
597
            'BZR_EMAIL': None,
1912.2.1 by Adeodato Simó
Clear $BZREMAIL in tests, not only the newer $BZR_EMAIL, since the
598
            'BZREMAIL': None, # may still be present in the environment
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
599
            'EMAIL': None,
600
        }
1185.38.4 by John Arbash Meinel
Making old_env a private member
601
        self.__old_env = {}
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
602
        self.addCleanup(self._restoreEnvironment)
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
603
        for name, value in new_env.iteritems():
604
            self._captureVar(name, value)
605
606
607
    def _captureVar(self, name, newvalue):
608
        """Set an environment variable, preparing it to be reset when finished."""
1185.38.4 by John Arbash Meinel
Making old_env a private member
609
        self.__old_env[name] = os.environ.get(name, None)
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
610
        if newvalue is None:
611
            if name in os.environ:
612
                del os.environ[name]
613
        else:
614
            os.environ[name] = newvalue
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
615
1185.38.2 by John Arbash Meinel
[patch] Aaron Bentley's HOME fix.
616
    @staticmethod
617
    def _restoreVar(name, value):
618
        if value is None:
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
619
            if name in os.environ:
620
                del os.environ[name]
1185.38.2 by John Arbash Meinel
[patch] Aaron Bentley's HOME fix.
621
        else:
622
            os.environ[name] = value
623
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
624
    def _restoreEnvironment(self):
1185.38.4 by John Arbash Meinel
Making old_env a private member
625
        for name, value in self.__old_env.iteritems():
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
626
            self._restoreVar(name, value)
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
627
628
    def tearDown(self):
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
629
        self._runCleanups()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
630
        unittest.TestCase.tearDown(self)
631
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)
632
    def time(self, callable, *args, **kwargs):
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
633
        """Run callable and accrue the time it takes to the benchmark time.
634
        
635
        If lsprofiling is enabled (i.e. by --lsprof-time to bzr selftest) then
636
        this will cause lsprofile statistics to be gathered and stored in
637
        self._benchcalls.
638
        """
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)
639
        if self._benchtime is None:
640
            self._benchtime = 0
641
        start = time.time()
642
        try:
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
643
            if not self._gather_lsprof_in_benchmarks:
644
                return callable(*args, **kwargs)
645
            else:
646
                # record this benchmark
647
                ret, stats = bzrlib.lsprof.profile(callable, *args, **kwargs)
648
                stats.sort()
649
                self._benchcalls.append(((callable, args, kwargs), stats))
650
                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)
651
        finally:
652
            self._benchtime += time.time() - start
653
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
654
    def _runCleanups(self):
655
        """Run registered cleanup functions. 
656
657
        This should only be called from TestCase.tearDown.
658
        """
1541 by Martin Pool
doc
659
        # TODO: Perhaps this should keep running cleanups even if 
660
        # one of them fails?
1185.33.74 by Martin Pool
pychecker cleanups
661
        for cleanup_fn in reversed(self._cleanups):
662
            cleanup_fn()
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
663
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
664
    def log(self, *args):
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
665
        mutter(*args)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
666
667
    def _get_log(self):
668
        """Return as a string the log for this test"""
1185.16.14 by Martin Pool
- make TestCase._get_log work even if setup was aborted
669
        if self._log_file_name:
670
            return open(self._log_file_name).read()
671
        else:
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
672
            return self._log_contents
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
673
        # TODO: Delete the log after it's been read in
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
674
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
675
    def capture(self, cmd, retcode=0):
1185.3.26 by Martin Pool
- remove remaining external executions of bzr
676
        """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.
677
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
1185.3.26 by Martin Pool
- remove remaining external executions of bzr
678
1685.1.52 by John Arbash Meinel
[merge] bzr.dev 1704
679
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
1185.22.7 by Michael Ellerman
Fix error in run_bzr_captured() doco
680
        """Invoke bzr and return (stdout, stderr).
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
681
682
        Useful for code that wants to check the contents of the
683
        output, the way error messages are presented, etc.
684
685
        This should be the main method for tests that want to exercise the
686
        overall behavior of the bzr application (rather than a unit test
687
        or a functional test of the library.)
688
689
        Much of the old code runs bzr by forking a new copy of Python, but
690
        that is slower, harder to debug, and generally not necessary.
691
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
692
        This runs bzr through the interface that catches and reports
693
        errors, and with logging set to something approximating the
694
        default, so that error reporting can be checked.
695
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
696
        :param argv: arguments to invoke bzr
697
        :param retcode: expected return code, or None for don't-care.
698
        :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.
699
        :param stdin: A string to be used as stdin for the command.
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
700
        """
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
701
        if encoding is None:
702
            encoding = bzrlib.user_encoding
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
703
        if stdin is not None:
704
            stdin = StringIO(stdin)
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
705
        stdout = StringIOWrapper()
706
        stderr = StringIOWrapper()
707
        stdout.encoding = encoding
708
        stderr.encoding = encoding
709
1185.85.72 by John Arbash Meinel
Fix some of the tests.
710
        self.log('run bzr: %r', argv)
1185.43.5 by Martin Pool
Update log message quoting
711
        # FIXME: don't call into logging here
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
712
        handler = logging.StreamHandler(stderr)
713
        handler.setLevel(logging.INFO)
714
        logger = logging.getLogger('')
715
        logger.addHandler(handler)
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
716
        old_ui_factory = bzrlib.ui.ui_factory
717
        bzrlib.ui.ui_factory = bzrlib.tests.blackbox.TestUIFactory(
718
            stdout=stdout,
719
            stderr=stderr)
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
720
        bzrlib.ui.ui_factory.stdin = stdin
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
721
        try:
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
722
            result = self.apply_redirected(stdin, stdout, stderr,
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
723
                                           bzrlib.commands.run_bzr_catch_errors,
724
                                           argv)
725
        finally:
726
            logger.removeHandler(handler)
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
727
            bzrlib.ui.ui_factory = old_ui_factory
1685.1.69 by Wouter van Heyst
merge bzr.dev 1740
728
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
729
        out = stdout.getvalue()
730
        err = stderr.getvalue()
731
        if out:
1185.85.72 by John Arbash Meinel
Fix some of the tests.
732
            self.log('output:\n%r', out)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
733
        if err:
1185.85.72 by John Arbash Meinel
Fix some of the tests.
734
            self.log('errors:\n%r', err)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
735
        if retcode is not None:
1685.1.2 by John Arbash Meinel
Re-enabling the non_ascii tests after fixing trace.py, bzr ignore also does the right thing now
736
            self.assertEquals(retcode, result)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
737
        return out, err
738
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
739
    def run_bzr(self, *args, **kwargs):
1119 by Martin Pool
doc
740
        """Invoke bzr, as if it were run from the command line.
741
742
        This should be the main method for tests that want to exercise the
743
        overall behavior of the bzr application (rather than a unit test
744
        or a functional test of the library.)
745
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
746
        This sends the stdout/stderr results into the test's log,
747
        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.
748
749
        :param stdin: A string to be used as stdin for the command.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
750
        """
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
751
        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
752
        encoding = kwargs.pop('encoding', None)
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
753
        stdin = kwargs.pop('stdin', None)
1685.1.52 by John Arbash Meinel
[merge] bzr.dev 1704
754
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding, stdin=stdin)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
755
1185.85.24 by John Arbash Meinel
Moved run_bzr_decode into TestCase
756
    def run_bzr_decode(self, *args, **kwargs):
757
        if kwargs.has_key('encoding'):
758
            encoding = kwargs['encoding']
759
        else:
760
            encoding = bzrlib.user_encoding
761
        return self.run_bzr(*args, **kwargs)[0].decode(encoding)
762
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.
763
    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
764
        """Run bzr, and check that stderr contains the supplied regexes
765
        
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
766
        :param error_regexes: Sequence of regular expressions which 
767
            must each be found in the error output. The relative ordering
768
            is not enforced.
769
        :param args: command-line arguments for bzr
770
        :param kwargs: Keyword arguments which are interpreted by run_bzr
771
            This function changes the default value of retcode to be 3,
772
            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
773
        :return: (out, err) The actual output of running the command (in case you
774
                 want to do more inspection)
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
775
776
        Examples of use:
777
            # Make sure that commit is failing because there is nothing to do
778
            self.run_bzr_error(['no changes to commit'],
779
                               'commit', '-m', 'my commit comment')
780
            # Make sure --strict is handling an unknown file, rather than
781
            # giving us the 'nothing to do' error
782
            self.build_tree(['unknown'])
783
            self.run_bzr_error(['Commit refused because there are unknown files'],
784
                               '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
785
        """
786
        kwargs.setdefault('retcode', 3)
1711.2.70 by John Arbash Meinel
Add run_bzr_errors alongside run_bzr, to make it easy to check the right error is occurring.
787
        out, err = self.run_bzr(*args, **kwargs)
788
        for regex in error_regexes:
789
            self.assertContainsRe(err, regex)
1711.2.71 by John Arbash Meinel
Default to retcode=3, and add a test for run_bzr_error
790
        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.
791
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
792
    def run_bzr_subprocess(self, *args, **kwargs):
793
        """Run bzr in a subprocess for testing.
794
795
        This starts a new Python interpreter and runs bzr in there. 
796
        This should only be used for tests that have a justifiable need for
797
        this isolation: e.g. they are testing startup time, or signal
798
        handling, or early startup code, etc.  Subprocess code can't be 
799
        profiled or debugged so easily.
1752.1.7 by Aaron Bentley
Stop using shlex in run_bzr_subprocess
800
801
        :param retcode: The status code that is expected.  Defaults to 0.  If
802
        None is supplied, the status code is not checked.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
803
        """
1752.2.36 by Martin Pool
More hpss transport-like operations
804
        # TODO: this ought to remove BZR_PDB when running the subprocess- the
805
        # user probably doesn't want to debug it, and anyhow since its files
806
        # are redirected they can't usefully get at it.  It just makes the
807
        # test suite hang.
1752.1.1 by Aaron Bentley
Add run_bzr_external
808
        bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
809
        args = list(args)
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
810
        process = Popen([sys.executable, bzr_path]+args, stdout=PIPE, 
811
                         stderr=PIPE)
1752.1.1 by Aaron Bentley
Add run_bzr_external
812
        out = process.stdout.read()
813
        err = process.stderr.read()
814
        retcode = process.wait()
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
815
        supplied_retcode = kwargs.get('retcode', 0)
1752.1.1 by Aaron Bentley
Add run_bzr_external
816
        if supplied_retcode is not None:
817
            assert supplied_retcode == retcode
818
        return [out, err]
819
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
820
    def check_inventory_shape(self, inv, shape):
1291 by Martin Pool
- add test for moving files between directories
821
        """Compare an inventory to a list of expected names.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
822
823
        Fail if they are not precisely equal.
824
        """
825
        extras = []
826
        shape = list(shape)             # copy
827
        for path, ie in inv.entries():
828
            name = path.replace('\\', '/')
829
            if ie.kind == 'dir':
830
                name = name + '/'
831
            if name in shape:
832
                shape.remove(name)
833
            else:
834
                extras.append(name)
835
        if shape:
836
            self.fail("expected paths not found in inventory: %r" % shape)
837
        if extras:
838
            self.fail("unexpected paths found in inventory: %r" % extras)
839
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
840
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
841
                         a_callable=None, *args, **kwargs):
842
        """Call callable with redirected std io pipes.
843
844
        Returns the return code."""
845
        if not callable(a_callable):
846
            raise ValueError("a_callable must be callable.")
847
        if stdin is None:
848
            stdin = StringIO("")
849
        if stdout is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
850
            if getattr(self, "_log_file", None) is not None:
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
851
                stdout = self._log_file
852
            else:
853
                stdout = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
854
        if stderr is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
855
            if getattr(self, "_log_file", None is not None):
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
856
                stderr = self._log_file
857
            else:
858
                stderr = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
859
        real_stdin = sys.stdin
860
        real_stdout = sys.stdout
861
        real_stderr = sys.stderr
862
        try:
863
            sys.stdout = stdout
864
            sys.stderr = stderr
865
            sys.stdin = stdin
1160 by Martin Pool
- tiny refactoring
866
            return a_callable(*args, **kwargs)
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
867
        finally:
868
            sys.stdout = real_stdout
869
            sys.stderr = real_stderr
870
            sys.stdin = real_stdin
871
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
872
    def merge(self, branch_from, wt_to):
873
        """A helper for tests to do a ui-less merge.
874
875
        This should move to the main library when someone has time to integrate
876
        it in.
877
        """
878
        # minimal ui-less merge.
879
        wt_to.branch.fetch(branch_from)
880
        base_rev = common_ancestor(branch_from.last_revision(),
881
                                   wt_to.branch.last_revision(),
882
                                   wt_to.branch.repository)
883
        merge_inner(wt_to.branch, branch_from.basis_tree(), 
884
                    wt_to.branch.repository.revision_tree(base_rev),
885
                    this_tree=wt_to)
886
        wt_to.add_pending_merge(branch_from.last_revision())
887
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
888
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
889
BzrTestBase = TestCase
890
891
     
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
892
class TestCaseInTempDir(TestCase):
893
    """Derived class that runs a test within a temporary directory.
894
895
    This is useful for tests that need to create a branch, etc.
896
897
    The directory is created in a slightly complex way: for each
898
    Python invocation, a new temporary top-level directory is created.
899
    All test cases create their own directory within that.  If the
900
    tests complete successfully, the directory is removed.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
901
902
    InTempDir is an old alias for FunctionalTestCase.
903
    """
904
905
    TEST_ROOT = None
906
    _TEST_NAME = 'test'
907
    OVERRIDE_PYTHON = 'python'
908
909
    def check_file_contents(self, filename, expect):
910
        self.log("check contents of file %s" % filename)
911
        contents = file(filename, 'r').read()
912
        if contents != expect:
913
            self.log("expected: %r" % expect)
914
            self.log("actually: %r" % contents)
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
915
            self.fail("contents of %s not as expected" % filename)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
916
917
    def _make_test_root(self):
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
918
        if TestCaseInTempDir.TEST_ROOT is not None:
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
919
            return
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
920
        i = 0
921
        while True:
1185.16.147 by Martin Pool
[patch] Test base directory must be unicode (from Alexander)
922
            root = u'test%04d.tmp' % i
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
923
            try:
924
                os.mkdir(root)
925
            except OSError, e:
926
                if e.errno == errno.EEXIST:
927
                    i += 1
928
                    continue
929
                else:
930
                    raise
931
            # successfully created
1185.31.37 by John Arbash Meinel
Switched os.path.abspath and os.path.realpath to osutils.* (still passes on cygwin)
932
            TestCaseInTempDir.TEST_ROOT = osutils.abspath(root)
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
933
            break
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
934
        # make a fake bzr directory there to prevent any tests propagating
935
        # up onto the source directory's real branch
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
936
        bzrdir.BzrDir.create_standalone_workingtree(TestCaseInTempDir.TEST_ROOT)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
937
938
    def setUp(self):
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
939
        super(TestCaseInTempDir, self).setUp()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
940
        self._make_test_root()
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
941
        _currentdir = os.getcwdu()
1551.6.2 by Aaron Bentley
Added explanatory comment
942
        # 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
943
        short_id = self.id().replace('bzrlib.tests.', '') \
1551.6.3 by Aaron Bentley
Updated from dev
944
                   .replace('__main__.', '')[-100:]
1540.3.20 by Martin Pool
Construct unique test directory names even when test ids recurr
945
        # it's possible the same test class is run several times for
946
        # parameterized tests, so make sure the names don't collide.  
947
        i = 0
948
        while True:
949
            if i > 0:
950
                candidate_dir = '%s/%s.%d' % (self.TEST_ROOT, short_id, i)
951
            else:
952
                candidate_dir = '%s/%s' % (self.TEST_ROOT, short_id)
953
            if os.path.exists(candidate_dir):
954
                i = i + 1
955
                continue
956
            else:
957
                self.test_dir = candidate_dir
958
                os.mkdir(self.test_dir)
959
                os.chdir(self.test_dir)
960
                break
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
961
        os.environ['HOME'] = self.test_dir
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
962
        os.environ['APPDATA'] = self.test_dir
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
963
        def _leaveDirectory():
964
            os.chdir(_currentdir)
965
        self.addCleanup(_leaveDirectory)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
966
        
1530.1.3 by Robert Collins
transport implementations now tested consistently.
967
    def build_tree(self, shape, line_endings='native', transport=None):
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
968
        """Build a test tree according to a pattern.
969
970
        shape is a sequence of file specifications.  If the final
971
        character is '/', a directory is created.
972
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
973
        This assumes that all the elements in the tree being built are new.
974
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
975
        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
976
        :param line_endings: Either 'binary' or 'native'
977
                             in binary mode, exact contents are written
978
                             in native mode, the line endings match the
979
                             default platform endings.
1530.1.3 by Robert Collins
transport implementations now tested consistently.
980
981
        :param transport: A transport to write to, for building trees on 
982
                          VFS's. If the transport is readonly or None,
983
                          "." is opened automatically.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
984
        """
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
985
        # It's OK to just create them using forward slashes on windows.
1530.1.3 by Robert Collins
transport implementations now tested consistently.
986
        if transport is None or transport.is_readonly():
1553.5.9 by Martin Pool
Add TestCaseWithTransport.get_transport and get_readonly_transport
987
            transport = get_transport(".")
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
988
        for name in shape:
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
989
            self.assert_(isinstance(name, basestring))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
990
            if name[-1] == '/':
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
991
                transport.mkdir(urlutils.escape(name[:-1]))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
992
            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
993
                if line_endings == 'binary':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
994
                    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
995
                elif line_endings == 'native':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
996
                    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
997
                else:
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.
998
                    raise errors.BzrError('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
999
                content = "contents of %s%s" % (name.encode('utf-8'), end)
1755.3.8 by John Arbash Meinel
Fix comments about why we do the things we do
1000
                # Technically 'put()' is the right command. However, put
1001
                # uses an AtomicFile, which requires an extra rename into place
1002
                # As long as the files didn't exist in the past, append() will
1003
                # do the same thing as put()
1004
                # On jam's machine, make_kernel_like_tree is:
1755.3.10 by John Arbash Meinel
Update the timing stats
1005
                #   put:    4.5-7.5s (averaging 6s)
1006
                #   append: 2.9-4.5s
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
1007
                transport.append(urlutils.escape(name), StringIO(content))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1008
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1009
    def build_tree_contents(self, shape):
1514 by Robert Collins
Unbreak self.build_tree_shape in tests.
1010
        build_tree_contents(shape)
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1011
1405 by Robert Collins
remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave
1012
    def failUnlessExists(self, path):
1013
        """Fail unless path, which may be abs or relative, exists."""
1448 by Robert Collins
revert symlinks correctly
1014
        self.failUnless(osutils.lexists(path))
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
1015
1016
    def failIfExists(self, path):
1017
        """Fail if path, which may be abs or relative, exists."""
1018
        self.failIf(osutils.lexists(path))
1405 by Robert Collins
remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave
1019
        
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
1020
    def assertFileEqual(self, content, path):
1021
        """Fail if path does not contain 'content'."""
1022
        self.failUnless(osutils.lexists(path))
1685.1.31 by John Arbash Meinel
Adding tests for the rest of the _win32 functions.
1023
        # TODO: jam 20060427 Shouldn't this be 'rb'?
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
1024
        self.assertEqualDiff(content, open(path, 'r').read())
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
1025
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1026
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1027
class TestCaseWithTransport(TestCaseInTempDir):
1028
    """A test case that provides get_url and get_readonly_url facilities.
1029
1030
    These back onto two transport servers, one for readonly access and one for
1031
    read write access.
1032
1033
    If no explicit class is provided for readonly access, a
1034
    ReadonlyTransportDecorator is used instead which allows the use of non disk
1035
    based read write transports.
1036
1037
    If an explicit class is provided for readonly access, that server and the 
1038
    readwrite one must both define get_url() as resolving to os.getcwd().
1039
    """
1040
1041
    def __init__(self, methodName='testMethod'):
1042
        super(TestCaseWithTransport, self).__init__(methodName)
1043
        self.__readonly_server = None
1044
        self.__server = None
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1045
        self.transport_server = default_transport
1534.4.13 by Robert Collins
Give a reasonable warning on attempts to upgrade a readonly url.
1046
        self.transport_readonly_server = None
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1047
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
1048
    def get_readonly_url(self, relpath=None):
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1049
        """Get a URL for the readonly transport.
1050
1051
        This will either be backed by '.' or a decorator to the transport 
1052
        used by self.get_url()
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
1053
        relpath provides for clients to get a path relative to the base url.
1054
        These should only be downwards relative, not upwards.
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1055
        """
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.
1056
        base = self.get_readonly_server().get_url()
1057
        if relpath is not None:
1058
            if not base.endswith('/'):
1059
                base = base + '/'
1060
            base = base + relpath
1061
        return base
1062
1063
    def get_readonly_server(self):
1064
        """Get the server instance for the readonly transport
1065
1066
        This is useful for some tests with specific servers to do diagnostics.
1067
        """
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1068
        if self.__readonly_server is None:
1069
            if self.transport_readonly_server is None:
1070
                # readonly decorator requested
1071
                # bring up the server
1072
                self.get_url()
1073
                self.__readonly_server = ReadonlyServer()
1074
                self.__readonly_server.setUp(self.__server)
1075
            else:
1076
                self.__readonly_server = self.transport_readonly_server()
1077
                self.__readonly_server.setUp()
1078
            self.addCleanup(self.__readonly_server.tearDown)
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.
1079
        return self.__readonly_server
1080
1081
    def get_server(self):
1082
        """Get the read/write server instance.
1083
1084
        This is useful for some tests with specific servers that need
1085
        diagnostics.
1086
        """
1087
        if self.__server is None:
1088
            self.__server = self.transport_server()
1089
            self.__server.setUp()
1090
            self.addCleanup(self.__server.tearDown)
1091
        return self.__server
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1092
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
1093
    def get_url(self, relpath=None):
1883.2.1 by Martin Pool
make_bzrdir and make_branch now work on transports that aren't backed by local
1094
        """Get a URL (or maybe a path) for the readwrite transport.
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1095
1096
        This will either be backed by '.' or to an equivalent non-file based
1097
        facility.
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
1098
        relpath provides for clients to get a path relative to the base url.
1099
        These should only be downwards relative, not upwards.
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1100
        """
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.
1101
        base = self.get_server().get_url()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1102
        if relpath is not None and relpath != '.':
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
1103
            if not base.endswith('/'):
1104
                base = base + '/'
1883.2.1 by Martin Pool
make_bzrdir and make_branch now work on transports that aren't backed by local
1105
            # XXX: Really base should be a url; we did after all call
1106
            # get_url()!  But sometimes it's just a path (from
1107
            # LocalAbspathServer), and it'd be wrong to append urlescaped data
1108
            # to a non-escaped local path.
1109
            if base.startswith('./') or base.startswith('/'):
1110
                base += relpath
1111
            else:
1112
                base += urlutils.escape(relpath)
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
1113
        return base
1114
1553.5.9 by Martin Pool
Add TestCaseWithTransport.get_transport and get_readonly_transport
1115
    def get_transport(self):
1116
        """Return a writeable transport for the test scratch space"""
1117
        t = get_transport(self.get_url())
1118
        self.assertFalse(t.is_readonly())
1119
        return t
1120
1121
    def get_readonly_transport(self):
1122
        """Return a readonly transport for the test scratch space
1123
        
1124
        This can be used to test that operations which should only need
1125
        readonly access in fact do not try to write.
1126
        """
1127
        t = get_transport(self.get_readonly_url())
1128
        self.assertTrue(t.is_readonly())
1129
        return t
1130
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1131
    def make_branch(self, relpath, format=None):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1132
        """Create a branch on the transport at relpath."""
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1133
        repo = self.make_repository(relpath, format=format)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1134
        return repo.bzrdir.create_branch()
1135
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1136
    def make_bzrdir(self, relpath, format=None):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1137
        try:
1883.2.1 by Martin Pool
make_bzrdir and make_branch now work on transports that aren't backed by local
1138
            # might be a relative or absolute path
1139
            maybe_a_url = self.get_url(relpath)
1140
            segments = maybe_a_url.split('/')
1141
            t = get_transport(maybe_a_url)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1142
            if segments and segments[-1] not in ('', '.'):
1143
                try:
1883.2.1 by Martin Pool
make_bzrdir and make_branch now work on transports that aren't backed by local
1144
                    t.mkdir('.')
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.
1145
                except errors.FileExists:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1146
                    pass
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1147
            if format is None:
1883.2.1 by Martin Pool
make_bzrdir and make_branch now work on transports that aren't backed by local
1148
                format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
1149
            return format.initialize_on_transport(t)
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.
1150
        except errors.UninitializableFormat:
1684.1.4 by Martin Pool
(patch) better warnings when tests are skipped (Alexander)
1151
            raise TestSkipped("Format %s is not initializable." % format)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1152
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1153
    def make_repository(self, relpath, shared=False, format=None):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1154
        """Create a repository on our default transport at relpath."""
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1155
        made_control = self.make_bzrdir(relpath, format=format)
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
1156
        return made_control.create_repository(shared=shared)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1157
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1158
    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.
1159
        """Create a branch on the transport and a tree locally.
1160
1883.2.1 by Martin Pool
make_bzrdir and make_branch now work on transports that aren't backed by local
1161
        If the transport is not a LocalTransport, the Tree can't be created on
1162
        the transport.  In that case the working tree is created in the local
1163
        directory, and the returned tree's branch and repository will also be
1164
        accessed locally.
1165
1166
        This will fail if the original default transport for this test
1167
        case wasn't backed by the working directory, as the branch won't
1168
        be on disk for us to open it.  
1169
1170
        :param format: The BzrDirFormat.
1171
        :returns: the WorkingTree.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1172
        """
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.
1173
        # TODO: always use the local disk path for the working tree,
1174
        # this obviously requires a format that supports branch references
1175
        # so check for that by checking bzrdir.BzrDirFormat.get_default_format()
1176
        # RBC 20060208
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1177
        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.
1178
        try:
1179
            return b.bzrdir.create_workingtree()
1180
        except errors.NotLocalUrl:
1883.2.1 by Martin Pool
make_bzrdir and make_branch now work on transports that aren't backed by local
1181
            # We can only make working trees locally at the moment.  If the
1182
            # transport can't support them, then reopen the branch on a local
1183
            # transport, and create the working tree there.  
1184
            #
1185
            # Possibly we should instead keep
1186
            # the non-disk-backed branch and create a local checkout?
1187
            bd = bzrdir.BzrDir.open(relpath)
1188
            return bd.create_workingtree()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1189
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
1190
    def assertIsDirectory(self, relpath, transport):
1191
        """Assert that relpath within transport is a directory.
1192
1193
        This may not be possible on all transports; in that case it propagates
1194
        a TransportNotPossible.
1195
        """
1196
        try:
1197
            mode = transport.stat(relpath).st_mode
1198
        except errors.NoSuchFile:
1199
            self.fail("path %s is not a directory; no such file"
1200
                      % (relpath))
1201
        if not stat.S_ISDIR(mode):
1202
            self.fail("path %s is not a directory; has mode %#o"
1203
                      % (relpath, mode))
1204
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
1205
1534.4.31 by Robert Collins
cleanedup test_outside_wt
1206
class ChrootedTestCase(TestCaseWithTransport):
1207
    """A support class that provides readonly urls outside the local namespace.
1208
1209
    This is done by checking if self.transport_server is a MemoryServer. if it
1210
    is then we are chrooted already, if it is not then an HttpServer is used
1211
    for readonly urls.
1212
1213
    TODO RBC 20060127: make this an option to TestCaseWithTransport so it can
1214
                       be used without needed to redo it when a different 
1215
                       subclass is in use ?
1216
    """
1217
1218
    def setUp(self):
1219
        super(ChrootedTestCase, self).setUp()
1220
        if not self.transport_server == bzrlib.transport.memory.MemoryServer:
1221
            self.transport_readonly_server = bzrlib.transport.http.HttpServer
1222
1223
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1224
def filter_suite_by_re(suite, pattern):
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
1225
    result = TestUtil.TestSuite()
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1226
    filter_re = re.compile(pattern)
1227
    for test in iter_suite_tests(suite):
1185.1.57 by Robert Collins
nuke --pattern to selftest, replace with regexp.search calls.
1228
        if filter_re.search(test.id()):
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1229
            result.addTest(test)
1230
    return result
1231
1232
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1233
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.
1234
              stop_on_failure=False, keep_output=False,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1235
              transport=None, lsprof_timed=None):
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
1236
    TestCaseInTempDir._TEST_NAME = name
1728.1.1 by Robert Collins
(rbc)Merge in benchmark --lsprof-timed lsprofiling feature. (Robert Collins, Martin Pool).
1237
    TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
1238
    if verbose:
1239
        verbosity = 2
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
1240
        pb = None
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
1241
    else:
1242
        verbosity = 1
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
1243
        pb = progress.ProgressBar()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
1244
    runner = TextTestRunner(stream=sys.stdout,
1245
                            descriptions=0,
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
1246
                            verbosity=verbosity,
1247
                            keep_output=keep_output,
1248
                            pb=pb)
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1249
    runner.stop_on_failure=stop_on_failure
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1250
    if pattern != '.*':
1251
        suite = filter_suite_by_re(suite, pattern)
1252
    result = runner.run(suite)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
1253
    return result.wasSuccessful()
1254
1255
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
1256
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.
1257
             keep_output=False,
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
1258
             transport=None,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1259
             test_suite_factory=None,
1260
             lsprof_timed=None):
1204 by Martin Pool
doc
1261
    """Run the whole test suite under the enhanced runner"""
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
1262
    # XXX: Very ugly way to do this...
1263
    # Disable warning about old formats because we don't want it to disturb
1264
    # any blackbox tests.
1265
    from bzrlib import repository
1266
    repository._deprecation_warning_done = True
1267
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.
1268
    global default_transport
1269
    if transport is None:
1270
        transport = default_transport
1271
    old_transport = default_transport
1272
    default_transport = transport
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1273
    try:
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
1274
        if test_suite_factory is None:
1275
            suite = test_suite()
1276
        else:
1277
            suite = test_suite_factory()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1278
        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.
1279
                     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
1280
                     transport=transport,
1281
                     lsprof_timed=lsprof_timed)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
1282
    finally:
1283
        default_transport = old_transport
1284
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
1285
1286
def test_suite():
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
1287
    """Build and return TestSuite for the whole of bzrlib.
1288
    
1289
    This function can be replaced if you need to change the default test
1290
    suite on a global basis, but it is not encouraged.
1291
    """
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
1292
    testmod_names = [
1518 by Robert Collins
Merge from mbp.
1293
                   'bzrlib.tests.test_ancestry',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
1294
                   '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.
1295
                   'bzrlib.tests.test_atomicfile',
1518 by Robert Collins
Merge from mbp.
1296
                   'bzrlib.tests.test_bad_files',
1297
                   'bzrlib.tests.test_branch',
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
1298
                   'bzrlib.tests.test_bundle',
1534.4.39 by Robert Collins
Basic BzrDir support.
1299
                   '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
1300
                   'bzrlib.tests.test_cache_utf8',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1301
                   'bzrlib.tests.test_command',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
1302
                   'bzrlib.tests.test_commit',
1303
                   'bzrlib.tests.test_commit_merge',
1304
                   'bzrlib.tests.test_config',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1305
                   'bzrlib.tests.test_conflicts',
1551.3.11 by Aaron Bentley
Merge from Robert
1306
                   'bzrlib.tests.test_decorators',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1307
                   'bzrlib.tests.test_diff',
1551.3.11 by Aaron Bentley
Merge from Robert
1308
                   'bzrlib.tests.test_doc_generate',
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1309
                   'bzrlib.tests.test_errors',
1185.80.5 by John Arbash Meinel
Changing the escaping just a little bit. Now we can handle unicode characters.
1310
                   'bzrlib.tests.test_escaped_store',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1311
                   'bzrlib.tests.test_fetch',
1518 by Robert Collins
Merge from mbp.
1312
                   'bzrlib.tests.test_gpg',
1313
                   'bzrlib.tests.test_graph',
1314
                   'bzrlib.tests.test_hashcache',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1315
                   'bzrlib.tests.test_http',
1786.1.8 by John Arbash Meinel
[merge] Johan Rydberg test updates
1316
                   'bzrlib.tests.test_http_response',
1518 by Robert Collins
Merge from mbp.
1317
                   'bzrlib.tests.test_identitymap',
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
1318
                   'bzrlib.tests.test_ignores',
1518 by Robert Collins
Merge from mbp.
1319
                   'bzrlib.tests.test_inv',
1563.2.4 by Robert Collins
First cut at including the knit implementation of versioned_file.
1320
                   'bzrlib.tests.test_knit',
1553.5.12 by Martin Pool
New LockDir locking mechanism
1321
                   'bzrlib.tests.test_lockdir',
1185.67.4 by Aaron Bentley
Throw if we try to write to a LockableFiles with no write lock
1322
                   'bzrlib.tests.test_lockable_files',
1518 by Robert Collins
Merge from mbp.
1323
                   'bzrlib.tests.test_log',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1324
                   '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
1325
                   'bzrlib.tests.test_merge3',
1518 by Robert Collins
Merge from mbp.
1326
                   'bzrlib.tests.test_merge_core',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1327
                   'bzrlib.tests.test_missing',
1518 by Robert Collins
Merge from mbp.
1328
                   '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
1329
                   'bzrlib.tests.test_nonascii',
1518 by Robert Collins
Merge from mbp.
1330
                   '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.
1331
                   'bzrlib.tests.test_osutils',
1558.15.6 by Aaron Bentley
Added more tests
1332
                   'bzrlib.tests.test_patch',
1185.82.9 by John Arbash Meinel
Moving patches testing into main test suite.
1333
                   'bzrlib.tests.test_patches',
1185.58.1 by John Arbash Meinel
Added new permissions test (currently don't pass)
1334
                   'bzrlib.tests.test_permissions',
1515 by Robert Collins
* Plugins with the same name in different directories in the bzr plugin
1335
                   'bzrlib.tests.test_plugins',
1551.2.27 by Aaron Bentley
Got propogation under test
1336
                   'bzrlib.tests.test_progress',
1570.1.11 by Robert Collins
Make reconcile work with shared repositories.
1337
                   'bzrlib.tests.test_reconcile',
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
1338
                   'bzrlib.tests.test_remote',
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1339
                   'bzrlib.tests.test_repository',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
1340
                   'bzrlib.tests.test_revision',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1341
                   'bzrlib.tests.test_revisionnamespaces',
1773.2.1 by Robert Collins
Teach all trees about unknowns, conflicts and get_parent_ids.
1342
                   'bzrlib.tests.test_revisiontree',
1185.47.1 by Martin Pool
[broken] start converting basic_io to more rfc822-like format
1343
                   'bzrlib.tests.test_rio',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1344
                   'bzrlib.tests.test_sampler',
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
1345
                   'bzrlib.tests.test_selftest',
1185.33.89 by Martin Pool
[patch] add a selftest test that the setup build script works (Alexander Belchenko)
1346
                   '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.
1347
                   'bzrlib.tests.test_sftp_transport',
1752.2.28 by Martin Pool
Change all classes to SmartServer, etc; other cleanups
1348
                   'bzrlib.tests.test_smart_transport',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
1349
                   'bzrlib.tests.test_smart_add',
1522 by Robert Collins
Test for the number of uses of self.working_tree() in branch.py
1350
                   'bzrlib.tests.test_source',
1551.6.19 by Aaron Bentley
Fix pending merge status on empty trees
1351
                   '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
1352
                   'bzrlib.tests.test_store',
1534.2.1 by Robert Collins
Implement deprecated_method
1353
                   'bzrlib.tests.test_symbol_versioning',
1518 by Robert Collins
Merge from mbp.
1354
                   'bzrlib.tests.test_testament',
1558.15.1 by Aaron Bentley
Add text_file function
1355
                   'bzrlib.tests.test_textfile',
1551.6.7 by Aaron Bentley
Implemented two-way merge, refactored weave merge
1356
                   'bzrlib.tests.test_textmerge',
1518 by Robert Collins
Merge from mbp.
1357
                   '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
1358
                   'bzrlib.tests.test_transactions',
1534.7.1 by Aaron Bentley
Got creation of a versioned file working
1359
                   '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
1360
                   'bzrlib.tests.test_transport',
1852.8.2 by Robert Collins
Add InterTree class to represent InterTree operations.
1361
                   'bzrlib.tests.test_tree',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
1362
                   'bzrlib.tests.test_tsort',
1666.1.2 by Robert Collins
Fix race condition between end of stream and end of file with tuned_gzip.
1363
                   'bzrlib.tests.test_tuned_gzip',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1364
                   'bzrlib.tests.test_ui',
1365
                   'bzrlib.tests.test_upgrade',
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
1366
                   'bzrlib.tests.test_urlutils',
1563.2.1 by Robert Collins
Merge in a variation of the versionedfile api from versioned-file.
1367
                   'bzrlib.tests.test_versionedfile',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1368
                   'bzrlib.tests.test_weave',
1369
                   '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
1370
                   'bzrlib.tests.test_workingtree',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
1371
                   'bzrlib.tests.test_xml',
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
1372
                   ]
1530.1.3 by Robert Collins
transport implementations now tested consistently.
1373
    test_transport_implementations = [
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
1374
        'bzrlib.tests.test_transport_implementations',
1375
        'bzrlib.tests.test_read_bundle',
1376
        ]
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
1377
    suite = TestUtil.TestSuite()
1707.2.2 by Robert Collins
Start on bench_add, an add benchtest.
1378
    loader = TestUtil.TestLoader()
1864.3.1 by John Arbash Meinel
Print out when a test fails in non verbose mode, run transport tests later
1379
    suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
1530.1.3 by Robert Collins
transport implementations now tested consistently.
1380
    from bzrlib.transport import TransportTestProviderAdapter
1381
    adapter = TransportTestProviderAdapter()
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
1382
    adapt_modules(test_transport_implementations, adapter, loader, suite)
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
1383
    for package in packages_to_test():
1384
        suite.addTest(package.test_suite())
855 by Martin Pool
- Patch from John to allow plugins to add their own tests.
1385
    for m in MODULES_TO_TEST:
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
1386
        suite.addTest(loader.loadTestsFromModule(m))
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
1387
    for m in MODULES_TO_DOCTEST:
1388
        suite.addTest(doctest.DocTestSuite(m))
1516 by Robert Collins
* bzrlib.plugin.all_plugins has been changed from an attribute to a
1389
    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.
1390
        if getattr(plugin, 'test_suite', None) is not None:
1516 by Robert Collins
* bzrlib.plugin.all_plugins has been changed from an attribute to a
1391
            suite.addTest(plugin.test_suite())
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
1392
    return suite
764 by Martin Pool
- log messages from a particular test are printed if that test fails
1393
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
1394
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
1395
def adapt_modules(mods_list, adapter, loader, suite):
1396
    """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.
1397
    for test in iter_suite_tests(loader.loadTestsFromModuleNames(mods_list)):
1398
        suite.addTests(adapter.adapt(test))