/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4988.10.3 by John Arbash Meinel
Merge bzr.dev 5007, resolve conflict, update NEWS
1
# Copyright (C) 2005-2010 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
608 by Martin Pool
- Split selftests out into a new module and start changing them
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
608 by Martin Pool
- Split selftests out into a new module and start changing them
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
608 by Martin Pool
- Split selftests out into a new module and start changing them
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
608 by Martin Pool
- Split selftests out into a new module and start changing them
16
5131.2.5 by Martin
Add module docstring to bzrlib.tests
17
"""Testing framework extensions"""
609 by Martin Pool
- cleanup test code
18
1535 by Martin Pool
todo idea from John
19
# TODO: Perhaps there should be an API to find out if bzr running under the
20
# test suite -- some plugins might want to avoid making intrusive changes if
21
# this is the case.  However, we want behaviour under to test to diverge as
22
# little as possible, so this should be used rarely if it's added at all.
23
# (Suggestion from j-a-meinel, 2005-11-24)
24
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
25
# NOTE: Some classes in here use camelCaseNaming() rather than
26
# underscore_naming().  That's for consistency with unittest; it's not the
27
# general style of bzrlib.  Please continue that consistency when adding e.g.
28
# new assertFoo() methods.
29
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
30
import atexit
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
31
import codecs
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
32
import copy
1185.1.29 by Robert Collins
merge merge tweaks from aaron, which includes latest .dev
33
from cStringIO import StringIO
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
34
import difflib
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
35
import doctest
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
36
import errno
5365.3.1 by Andrew Bennetts
Better (and simpler) algorithm for partition_tests.
37
import itertools
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
38
import logging
39
import os
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
40
import platform
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
41
import pprint
2394.2.2 by Ian Clatworthy
Add --randomize and update help
42
import random
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
43
import re
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
44
import shlex
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
45
import stat
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
46
import subprocess
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
47
import sys
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
48
import tempfile
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
49
import threading
3084.1.1 by Andrew Bennetts
Add a --coverage option to selftest.
50
import time
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
51
import traceback
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
52
import unittest
2485.6.5 by Martin Pool
Remove keep_output option
53
import warnings
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
54
4794.1.1 by Robert Collins
Derive bzr's TestCase from testtools.testcase.TestCase.
55
import testtools
4922.1.2 by Martin Pool
Better guards on checks of testtools versions
56
# nb: check this before importing anything else from within it
57
_testtools_version = getattr(testtools, '__version__', ())
58
if _testtools_version < (0, 9, 2):
59
    raise ImportError("need at least testtools 0.9.2: %s is %r"
60
        % (testtools.__file__, _testtools_version))
4794.1.6 by Robert Collins
Add a details object to bzr tests containing the test log. May currently result in failures show the log twice (but will now show the log in --subunit mode [which includes --parallel]).
61
from testtools import content
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
62
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
63
from bzrlib import (
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
64
    branchbuilder,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
65
    bzrdir,
4634.90.2 by Andrew Bennetts
Clear chk_map page cache in TestCase._run_bzr_core, causes blackbox.test_log to fail without fix in previous revision.
66
    chk_map,
4695.3.2 by Vincent Ladeuil
Simplified and claried as per Robert's review.
67
    config,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
68
    debug,
69
    errors,
4119.3.1 by Robert Collins
Create a single registry of all Hooks classes, removing the test suite knowledge of such hooks and allowing plugins to sensibly and safely define new hooks.
70
    hooks,
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
71
    lock as _mod_lock,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
72
    memorytree,
73
    osutils,
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
74
    ui,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
75
    urlutils,
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
76
    registry,
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
77
    transport as _mod_transport,
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
78
    workingtree,
2095.5.3 by Martin Pool
Disable all debug_flags when running blackbox tests
79
    )
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
80
import bzrlib.branch
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
81
import bzrlib.commands
1551.12.28 by Aaron Bentley
Move bundle timestamp code to timestamp
82
import bzrlib.timestamp
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
83
import bzrlib.export
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
84
import bzrlib.inventory
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
85
import bzrlib.iterablefile
1553.5.19 by Martin Pool
Run lockdir doctests
86
import bzrlib.lockdir
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
87
try:
88
    import bzrlib.lsprof
89
except ImportError:
90
    # lsprof not available
91
    pass
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
92
from bzrlib.merge import merge_inner
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
93
import bzrlib.merge3
94
import bzrlib.plugin
4160.2.4 by Andrew Bennetts
Use BzrDir pre_open hook to jail request code from accessing transports other than the backing transport.
95
from bzrlib.smart import client, request, server
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
96
import bzrlib.store
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
97
from bzrlib import symbol_versioning
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
98
from bzrlib.symbol_versioning import (
2921.6.5 by Robert Collins
* The ``exclude_pattern`` parameter to the ``bzrlib.tests.`` functions
99
    DEPRECATED_PARAMETER,
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
100
    deprecated_function,
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
101
    deprecated_in,
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
102
    deprecated_method,
2921.6.5 by Robert Collins
* The ``exclude_pattern`` parameter to the ``bzrlib.tests.`` functions
103
    deprecated_passed,
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
104
    )
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
105
import bzrlib.trace
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
106
from bzrlib.transport import (
107
    memory,
108
    pathfilter,
109
    )
2095.4.1 by Martin Pool
Better progress bars during tests
110
from bzrlib.trace import mutter, note
5017.3.6 by Vincent Ladeuil
Fix some fallouts of moving test servers around.
111
from bzrlib.tests import (
112
    test_server,
113
    TestUtil,
5200.2.3 by Robert Collins
Make 'pydoc bzrlib.tests.build_tree_shape' useful.
114
    treeshape,
5017.3.6 by Vincent Ladeuil
Fix some fallouts of moving test servers around.
115
    )
4580.2.1 by Martin Pool
TestUIFactory no longer needs to pretend to be its own ProgressView
116
from bzrlib.ui import NullProgressView
4449.3.18 by Martin Pool
Fuse CLIUIFactory and TextUIFactory and deprecate the old name
117
from bzrlib.ui.text import TextUIFactory
2948.4.1 by Lukáš Lalinský
Custom template-based version info formatter.
118
import bzrlib.version_info_formats.format_custom
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
119
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
120
2387.2.1 by Robert Collins
Mark bzrlib.tests as providing assertFOO helper functions by adding a __unittest global attribute. (Robert Collins, Andrew Bennetts, Martin Pool, Jonathan Lange)
121
# Mark this python module as being part of the implementation
122
# of unittest: this gives us better tracebacks where the last
123
# shown frame is the test code, not our assertXYZ.
2598.5.7 by Aaron Bentley
Updates from review
124
__unittest = 1
2387.2.1 by Robert Collins
Mark bzrlib.tests as providing assertFOO helper functions by adding a __unittest global attribute. (Robert Collins, Andrew Bennetts, Martin Pool, Jonathan Lange)
125
5017.3.6 by Vincent Ladeuil
Fix some fallouts of moving test servers around.
126
default_transport = test_server.LocalURLServer
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
127
4985.1.3 by Vincent Ladeuil
Change it to a more usable form.
128
129
_unitialized_attr = object()
130
"""A sentinel needed to act as a default value in a method signature."""
131
132
4573.2.3 by Robert Collins
Support python 2.4.
133
# Subunit result codes, defined here to prevent a hard dependency on subunit.
134
SUBUNIT_SEEK_SET = 0
135
SUBUNIT_SEEK_CUR = 1
136
5404.2.1 by John Arbash Meinel
Fix bug #627438 by restoring TestSuite and TestLoader.
137
# These are intentionally brought into this namespace. That way plugins, etc
138
# can just "from bzrlib.tests import TestCase, TestLoader, etc"
139
TestSuite = TestUtil.TestSuite
140
TestLoader = TestUtil.TestLoader
1185.82.7 by John Arbash Meinel
Adding patches.py into bzrlib, including the tests into the test suite.
141
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
142
class ExtendedTestResult(testtools.TextTestResult):
2095.4.1 by Martin Pool
Better progress bars during tests
143
    """Accepts, reports and accumulates the results of running tests.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
144
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
145
    Compared to the unittest version this class adds support for
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
146
    profiling, benchmarking, stopping as soon as a test fails,  and
147
    skipping tests.  There are further-specialized subclasses for
148
    different types of display.
149
150
    When a test finishes, in whatever way, it calls one of the addSuccess,
151
    addFailure or addError classes.  These in turn may redirect to a more
152
    specific case for the special test results supported by our extended
153
    tests.
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
154
155
    Note that just one of these objects is fed the results from many tests.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
156
    """
2095.4.1 by Martin Pool
Better progress bars during tests
157
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
158
    stop_early = False
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
159
2095.4.1 by Martin Pool
Better progress bars during tests
160
    def __init__(self, stream, descriptions, verbosity,
161
                 bench_history=None,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
162
                 strict=False,
2095.4.1 by Martin Pool
Better progress bars during tests
163
                 ):
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
164
        """Construct new TestResult.
165
166
        :param bench_history: Optionally, a writable file object to accumulate
167
            benchmark results.
168
        """
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
169
        testtools.TextTestResult.__init__(self, stream)
1819.1.1 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Give the test result object an optional benchmark
170
        if bench_history is not None:
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
171
            from bzrlib.version import _get_bzr_source_tree
172
            src_tree = _get_bzr_source_tree()
173
            if src_tree:
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
174
                try:
175
                    revision_id = src_tree.get_parent_ids()[0]
176
                except IndexError:
177
                    # XXX: if this is a brand new tree, do the same as if there
178
                    # is no branch.
179
                    revision_id = ''
1819.1.8 by Martin Pool
Improved reporting of bzrlib revision_id
180
            else:
181
                # XXX: If there's no branch, what should we do?
182
                revision_id = ''
1819.1.4 by Jan Balster
save the revison id for every benchmark run in .perf-history
183
            bench_history.write("--date %s %s\n" % (time.time(), revision_id))
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
184
        self._bench_history = bench_history
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
185
        self.ui = ui.ui_factory
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
186
        self.num_tests = 0
2095.4.1 by Martin Pool
Better progress bars during tests
187
        self.error_count = 0
188
        self.failure_count = 0
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
189
        self.known_failure_count = 0
2095.4.1 by Martin Pool
Better progress bars during tests
190
        self.skip_count = 0
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
191
        self.not_applicable_count = 0
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
192
        self.unsupported = {}
2095.4.1 by Martin Pool
Better progress bars during tests
193
        self.count = 0
194
        self._overall_start_time = time.time()
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
195
        self._strict = strict
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
196
        self._first_thread_leaker_id = None
197
        self._tests_leaking_threads_count = 0
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
198
        self._traceback_from_test = None
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
199
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
200
    def stopTestRun(self):
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
201
        run = self.testsRun
202
        actionTaken = "Ran"
203
        stopTime = time.time()
204
        timeTaken = stopTime - self.startTime
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
205
        # GZ 2010-07-19: Seems testtools has no printErrors method, and though
206
        #                the parent class method is similar have to duplicate
207
        self._show_list('ERROR', self.errors)
208
        self._show_list('FAIL', self.failures)
209
        self.stream.write(self.sep2)
210
        self.stream.write("%s %d test%s in %.3fs\n\n" % (actionTaken,
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
211
                            run, run != 1 and "s" or "", timeTaken))
212
        if not self.wasSuccessful():
213
            self.stream.write("FAILED (")
214
            failed, errored = map(len, (self.failures, self.errors))
215
            if failed:
216
                self.stream.write("failures=%d" % failed)
217
            if errored:
218
                if failed: self.stream.write(", ")
219
                self.stream.write("errors=%d" % errored)
220
            if self.known_failure_count:
221
                if failed or errored: self.stream.write(", ")
222
                self.stream.write("known_failure_count=%d" %
223
                    self.known_failure_count)
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
224
            self.stream.write(")\n")
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
225
        else:
226
            if self.known_failure_count:
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
227
                self.stream.write("OK (known_failures=%d)\n" %
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
228
                    self.known_failure_count)
229
            else:
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
230
                self.stream.write("OK\n")
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
231
        if self.skip_count > 0:
232
            skipped = self.skip_count
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
233
            self.stream.write('%d test%s skipped\n' %
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
234
                                (skipped, skipped != 1 and "s" or ""))
235
        if self.unsupported:
236
            for feature, count in sorted(self.unsupported.items()):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
237
                self.stream.write("Missing feature '%s' skipped %d tests.\n" %
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
238
                    (feature, count))
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
239
        if self._strict:
240
            ok = self.wasStrictlySuccessful()
241
        else:
242
            ok = self.wasSuccessful()
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
243
        if self._first_thread_leaker_id:
4271.2.2 by Robert Collins
Move thread leak reporting to ExtendedTestResult.
244
            self.stream.write(
245
                '%s is leaking threads among %d leaking tests.\n' % (
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
246
                self._first_thread_leaker_id,
247
                self._tests_leaking_threads_count))
4731.2.8 by Vincent Ladeuil
Collect and shutdown clients for SmartTCPServer_for_testing.
248
            # We don't report the main thread as an active one.
4732.2.1 by Vincent Ladeuil
Clearer thread leaks reports.
249
            self.stream.write(
250
                '%d non-main threads were left active in the end.\n'
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
251
                % (len(self._active_threads) - 1))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
252
4789.29.1 by Robert Collins
Show test ids not descriptions when reporting error/failures in tests.
253
    def getDescription(self, test):
254
        return test.id()
255
4794.1.10 by Robert Collins
Add benchmark time details object.
256
    def _extractBenchmarkTime(self, testCase, details=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).
257
        """Add a benchmark time for the current test case."""
4794.1.10 by Robert Collins
Add benchmark time details object.
258
        if details and 'benchtime' in details:
259
            return float(''.join(details['benchtime'].iter_bytes()))
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
260
        return getattr(testCase, "_benchtime", None)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
261
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
262
    def _elapsedTestTimeString(self):
263
        """Return a time string for the overall time the current test has taken."""
5445.1.1 by Martin
Use times from testtools for individual test case timings
264
        return self._formatTime(self._delta_to_float(
265
            self._now() - self._start_datetime))
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
266
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
267
    def _testTimeString(self, testCase):
268
        benchmark_time = self._extractBenchmarkTime(testCase)
269
        if benchmark_time is not None:
4536.5.2 by Martin Pool
Reserve less space for test elapsed time; more space for test name
270
            return self._formatTime(benchmark_time) + "*"
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
271
        else:
4536.5.5 by Martin Pool
More selftest display test tweaks
272
            return 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).
273
274
    def _formatTime(self, seconds):
275
        """Format seconds as milliseconds with leading spaces."""
2196.1.1 by Martin Pool
better formatting of benchmark output so it doesn't wrap
276
        # some benchmarks can take thousands of seconds to run, so we need 8
277
        # places
278
        return "%8dms" % (1000 * seconds)
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
279
2095.4.1 by Martin Pool
Better progress bars during tests
280
    def _shortened_test_description(self, test):
281
        what = test.id()
5050.10.4 by Martin Pool
Remove more selftest --benchmark references
282
        what = re.sub(r'^bzrlib\.tests\.', '', what)
2095.4.1 by Martin Pool
Better progress bars during tests
283
        return what
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
284
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
285
    # GZ 2010-10-04: Cloned tests may end up harmlessly calling this method
286
    #                multiple times in a row, because the handler is added for
287
    #                each test but the container list is shared between cases.
288
    #                See lp:498869 lp:625574 and lp:637725 for background.
289
    def _record_traceback_from_test(self, exc_info):
290
        """Store the traceback from passed exc_info tuple till"""
291
        self._traceback_from_test = exc_info[2]
292
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
293
    def startTest(self, test):
5340.6.2 by Martin
Replace remaining to unittest.TestResult methods with super
294
        super(ExtendedTestResult, self).startTest(test)
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
295
        if self.count == 0:
296
            self.startTests()
5412.1.5 by Martin
Move test count addition into startTest from report methods in subclasses
297
        self.count += 1
2095.4.1 by Martin Pool
Better progress bars during tests
298
        self.report_test_start(test)
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
299
        test.number = self.count
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
300
        self._recordTestStartTime()
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
301
        # Make testtools cases give us the real traceback on failure
302
        addOnException = getattr(test, "addOnException", None)
303
        if addOnException is not None:
304
            addOnException(self._record_traceback_from_test)
5412.1.6 by Martin
Document the less obvious code and note future reporting plans, as requested in review by vila
305
        # Only check for thread leaks if the test case supports cleanups
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
306
        addCleanup = getattr(test, "addCleanup", None)
307
        if addCleanup is not None:
308
            addCleanup(self._check_leaked_threads, test)
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
309
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
310
    def startTests(self):
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
311
        self.report_tests_starting()
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
312
        self._active_threads = threading.enumerate()
313
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
314
    def stopTest(self, test):
315
        self._traceback_from_test = None
316
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
317
    def _check_leaked_threads(self, test):
5412.1.6 by Martin
Document the less obvious code and note future reporting plans, as requested in review by vila
318
        """See if any threads have leaked since last call
319
320
        A sample of live threads is stored in the _active_threads attribute,
321
        when this method runs it compares the current live threads and any not
322
        in the previous sample are treated as having leaked.
323
        """
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
324
        now_active_threads = set(threading.enumerate())
325
        threads_leaked = now_active_threads.difference(self._active_threads)
326
        if threads_leaked:
327
            self._report_thread_leak(test, threads_leaked, now_active_threads)
328
            self._tests_leaking_threads_count += 1
329
            if self._first_thread_leaker_id is None:
330
                self._first_thread_leaker_id = test.id()
331
            self._active_threads = now_active_threads
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
332
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
333
    def _recordTestStartTime(self):
334
        """Record that a test has started."""
5445.1.1 by Martin
Use times from testtools for individual test case timings
335
        self._start_datetime = self._now()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
336
337
    def addError(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
338
        """Tell result that test finished with an error.
339
340
        Called from the TestCase run() method when the test
341
        fails with an unexpected error.
342
        """
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
343
        self._post_mortem(self._traceback_from_test)
5340.6.2 by Martin
Replace remaining to unittest.TestResult methods with super
344
        super(ExtendedTestResult, self).addError(test, err)
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
345
        self.error_count += 1
346
        self.report_error(test, err)
347
        if self.stop_early:
348
            self.stop()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
349
350
    def addFailure(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
351
        """Tell result that test failed.
352
353
        Called from the TestCase run() method when the test
354
        fails because e.g. an assert() method failed.
355
        """
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
356
        self._post_mortem(self._traceback_from_test)
5340.6.2 by Martin
Replace remaining to unittest.TestResult methods with super
357
        super(ExtendedTestResult, self).addFailure(test, err)
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
358
        self.failure_count += 1
359
        self.report_failure(test, err)
360
        if self.stop_early:
361
            self.stop()
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
362
4794.1.10 by Robert Collins
Add benchmark time details object.
363
    def addSuccess(self, test, details=None):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
364
        """Tell result that test completed successfully.
365
366
        Called from the TestCase run()
367
        """
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
368
        if self._bench_history is not None:
4794.1.10 by Robert Collins
Add benchmark time details object.
369
            benchmark_time = self._extractBenchmarkTime(test, details)
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
370
            if benchmark_time is not None:
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
371
                self._bench_history.write("%s %s\n" % (
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
372
                    self._formatTime(benchmark_time),
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
373
                    test.id()))
2095.4.1 by Martin Pool
Better progress bars during tests
374
        self.report_success(test)
5340.6.2 by Martin
Replace remaining to unittest.TestResult methods with super
375
        super(ExtendedTestResult, self).addSuccess(test)
3224.4.4 by Andrew Bennetts
Tweak clearing of _log_contents (idea from John).
376
        test._log_contents = ''
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
377
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
378
    def addExpectedFailure(self, test, err):
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
379
        self.known_failure_count += 1
380
        self.report_known_failure(test, err)
381
382
    def addNotSupported(self, test, feature):
383
        """The test will not be run because of a missing feature.
384
        """
385
        # this can be called in two different ways: it may be that the
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
386
        # test started running, and then raised (through requireFeature)
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
387
        # UnavailableFeature.  Alternatively this method can be called
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
388
        # while probing for features before running the test code proper; in
389
        # that case we will see startTest and stopTest, but the test will
390
        # never actually run.
2695.1.1 by Martin Pool
Fix problem if the first test is missing a dependency
391
        self.unsupported.setdefault(str(feature), 0)
392
        self.unsupported[str(feature)] += 1
393
        self.report_unsupported(test, feature)
394
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
395
    def addSkip(self, test, reason):
396
        """A test has not run for 'reason'."""
397
        self.skip_count += 1
398
        self.report_skip(test, reason)
399
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
400
    def addNotApplicable(self, test, reason):
401
        self.not_applicable_count += 1
402
        self.report_not_applicable(test, reason)
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
403
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
404
    def _post_mortem(self, tb=None):
4685.1.1 by Robert Collins
Use BZR_TEST_PDB=1 to trigger post_mortems in test failures.
405
        """Start a PDB post mortem session."""
406
        if os.environ.get('BZR_TEST_PDB', None):
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
407
            import pdb
408
            pdb.post_mortem(tb)
4685.1.1 by Robert Collins
Use BZR_TEST_PDB=1 to trigger post_mortems in test failures.
409
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
410
    def progress(self, offset, whence):
411
        """The test is adjusting the count of tests to run."""
4573.2.3 by Robert Collins
Support python 2.4.
412
        if whence == SUBUNIT_SEEK_SET:
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
413
            self.num_tests = offset
4573.2.3 by Robert Collins
Support python 2.4.
414
        elif whence == SUBUNIT_SEEK_CUR:
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
415
            self.num_tests += offset
416
        else:
417
            raise errors.BzrError("Unknown whence %r" % whence)
418
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
419
    def report_tests_starting(self):
420
        """Display information before the test run begins"""
421
        if getattr(sys, 'frozen', None) is None:
422
            bzr_path = osutils.realpath(sys.argv[0])
423
        else:
424
            bzr_path = sys.executable
425
        self.stream.write(
426
            'bzr selftest: %s\n' % (bzr_path,))
427
        self.stream.write(
428
            '   %s\n' % (
429
                    bzrlib.__path__[0],))
430
        self.stream.write(
431
            '   bzr-%s python-%s %s\n' % (
432
                    bzrlib.version_string,
433
                    bzrlib._format_version_tuple(sys.version_info),
434
                    platform.platform(aliased=1),
435
                    ))
436
        self.stream.write('\n')
437
5412.1.3 by Martin
Add tests for test case thread leak detection
438
    def report_test_start(self, test):
439
        """Display information on the test just about to be run"""
440
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
441
    def _report_thread_leak(self, test, leaked_threads, active_threads):
442
        """Display information on a test that leaked one or more threads"""
5412.1.6 by Martin
Document the less obvious code and note future reporting plans, as requested in review by vila
443
        # GZ 2010-09-09: A leak summary reported separately from the general
444
        #                thread debugging would be nice. Tests under subunit
445
        #                need something not using stream, perhaps adding a
446
        #                testtools details object would be fitting.
5412.1.1 by Martin
Move leak detection code from TestCase to ExtendedTestResult and clean up
447
        if 'threads' in selftest_debug_flags:
448
            self.stream.write('%s is leaking, active is now %d\n' %
449
                (test.id(), len(active_threads)))
450
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
451
    def startTestRun(self):
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
452
        self.startTime = time.time()
453
2095.4.1 by Martin Pool
Better progress bars during tests
454
    def report_success(self, test):
455
        pass
456
2658.3.1 by Daniel Watkins
Added ExtendedTestResult.wasStrictlySuccessful.
457
    def wasStrictlySuccessful(self):
458
        if self.unsupported or self.known_failure_count:
459
            return False
460
        return self.wasSuccessful()
461
462
2095.4.1 by Martin Pool
Better progress bars during tests
463
class TextTestResult(ExtendedTestResult):
464
    """Displays progress and results of tests in text form"""
465
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
466
    def __init__(self, stream, descriptions, verbosity,
467
                 bench_history=None,
468
                 pb=None,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
469
                 strict=None,
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
470
                 ):
471
        ExtendedTestResult.__init__(self, stream, descriptions, verbosity,
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
472
            bench_history, strict)
4580.3.2 by Martin Pool
TextTestResult now clears off the pb when the tests are done
473
        # We no longer pass them around, but just rely on the UIFactory stack
474
        # for state
475
        if pb is not None:
476
            warnings.warn("Passing pb to TextTestResult is deprecated")
477
        self.pb = self.ui.nested_progress_bar()
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
478
        self.pb.show_pct = False
479
        self.pb.show_spinner = False
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
480
        self.pb.show_eta = False,
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
481
        self.pb.show_count = False
482
        self.pb.show_bar = False
4580.3.3 by Martin Pool
Test progress bar has zero latency so it's more accurate
483
        self.pb.update_latency = 0
4580.3.5 by Martin Pool
selftest sets ProgressTask.show_transport_activity off
484
        self.pb.show_transport_activity = False
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
485
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
486
    def stopTestRun(self):
4580.3.6 by Martin Pool
TextTestResult should also clear pb before done()
487
        # called when the tests that are going to run have run
488
        self.pb.clear()
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
489
        self.pb.finished()
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
490
        super(TextTestResult, self).stopTestRun()
4580.3.6 by Martin Pool
TextTestResult should also clear pb before done()
491
5425.3.2 by Martin
Delay writing test start reports to inside first test run
492
    def report_tests_starting(self):
493
        super(TextTestResult, self).report_tests_starting()
4103.3.2 by Martin Pool
Remove trailing punctuation from progress messages
494
        self.pb.update('[test 0/%d] Starting' % (self.num_tests))
2095.4.1 by Martin Pool
Better progress bars during tests
495
496
    def _progress_prefix_text(self):
3297.1.1 by Martin Pool
More concise display of test progress bar
497
        # the longer this text, the less space we have to show the test
498
        # name...
499
        a = '[%d' % self.count              # total that have been run
500
        # tests skipped as known not to be relevant are not important enough
501
        # to show here
502
        ## if self.skip_count:
503
        ##     a += ', %d skip' % self.skip_count
504
        ## if self.known_failure_count:
505
        ##     a += '+%dX' % self.known_failure_count
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
506
        if self.num_tests:
2095.4.1 by Martin Pool
Better progress bars during tests
507
            a +='/%d' % self.num_tests
3297.1.1 by Martin Pool
More concise display of test progress bar
508
        a += ' in '
509
        runtime = time.time() - self._overall_start_time
510
        if runtime >= 60:
511
            a += '%dm%ds' % (runtime / 60, runtime % 60)
512
        else:
513
            a += '%ds' % runtime
4917.1.1 by Martin Pool
Test progress bar now lumps together tests that error and those that fail
514
        total_fail_count = self.error_count + self.failure_count
515
        if total_fail_count:
516
            a += ', %d failed' % total_fail_count
4721.1.1 by Martin Pool
Stop showing the number of tests due to missing features in the test progress bar.
517
        # if self.unsupported:
518
        #     a += ', %d missing' % len(self.unsupported)
2095.4.3 by Martin Pool
Tweak test display a bit more
519
        a += ']'
2095.4.1 by Martin Pool
Better progress bars during tests
520
        return a
521
522
    def report_test_start(self, test):
2095.4.5 by mbp at sourcefrog
Use regular progress-bar classes, not a special mechanism
523
        self.pb.update(
2095.4.1 by Martin Pool
Better progress bars during tests
524
                self._progress_prefix_text()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
525
                + ' '
2095.4.1 by Martin Pool
Better progress bars during tests
526
                + self._shortened_test_description(test))
527
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
528
    def _test_description(self, test):
2598.4.1 by Martin Pool
Remove obsolete --clean-output, --keep-output, --numbered-dirs selftest options (thanks Alexander)
529
        return self._shortened_test_description(test)
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
530
2095.4.3 by Martin Pool
Tweak test display a bit more
531
    def report_error(self, test, err):
5159.2.1 by Vincent Ladeuil
bzrlib.tests.TextTestResult should use self.stream not ui.note.
532
        self.stream.write('ERROR: %s\n    %s\n' % (
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
533
            self._test_description(test),
2095.4.3 by Martin Pool
Tweak test display a bit more
534
            err[1],
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
535
            ))
2095.4.1 by Martin Pool
Better progress bars during tests
536
2095.4.3 by Martin Pool
Tweak test display a bit more
537
    def report_failure(self, test, err):
5159.2.1 by Vincent Ladeuil
bzrlib.tests.TextTestResult should use self.stream not ui.note.
538
        self.stream.write('FAIL: %s\n    %s\n' % (
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
539
            self._test_description(test),
2095.4.3 by Martin Pool
Tweak test display a bit more
540
            err[1],
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
541
            ))
2095.4.1 by Martin Pool
Better progress bars during tests
542
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
543
    def report_known_failure(self, test, err):
4794.1.15 by Robert Collins
Review feedback.
544
        pass
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
545
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
546
    def report_skip(self, test, reason):
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
547
        pass
548
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
549
    def report_not_applicable(self, test, reason):
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
550
        pass
2095.4.1 by Martin Pool
Better progress bars during tests
551
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
552
    def report_unsupported(self, test, feature):
553
        """test cannot be run because feature is missing."""
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
554
2095.4.1 by Martin Pool
Better progress bars during tests
555
556
class VerboseTestResult(ExtendedTestResult):
557
    """Produce long output, with one line per test run plus times"""
558
559
    def _ellipsize_to_right(self, a_string, final_width):
560
        """Truncate and pad a string, keeping the right hand side"""
561
        if len(a_string) > final_width:
562
            result = '...' + a_string[3-final_width:]
563
        else:
564
            result = a_string
565
        return result.ljust(final_width)
566
5425.3.2 by Martin
Delay writing test start reports to inside first test run
567
    def report_tests_starting(self):
2095.4.1 by Martin Pool
Better progress bars during tests
568
        self.stream.write('running %d tests...\n' % self.num_tests)
5425.3.2 by Martin
Delay writing test start reports to inside first test run
569
        super(VerboseTestResult, self).report_tests_starting()
2095.4.1 by Martin Pool
Better progress bars during tests
570
571
    def report_test_start(self, test):
572
        name = self._shortened_test_description(test)
4747.3.6 by Vincent Ladeuil
terminal_width can now returns None.
573
        width = osutils.terminal_width()
574
        if width is not None:
575
            # width needs space for 6 char status, plus 1 for slash, plus an
576
            # 11-char time string, plus a trailing blank
577
            # when NUMBERED_DIRS: plus 5 chars on test number, plus 1 char on
578
            # space
579
            self.stream.write(self._ellipsize_to_right(name, width-18))
580
        else:
581
            self.stream.write(name)
2095.4.1 by Martin Pool
Better progress bars during tests
582
        self.stream.flush()
583
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
584
    def _error_summary(self, err):
585
        indent = ' ' * 4
586
        return '%s%s' % (indent, err[1])
587
2095.4.3 by Martin Pool
Tweak test display a bit more
588
    def report_error(self, test, err):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
589
        self.stream.write('ERROR %s\n%s\n'
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
590
                % (self._testTimeString(test),
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
591
                   self._error_summary(err)))
2095.4.1 by Martin Pool
Better progress bars during tests
592
2095.4.3 by Martin Pool
Tweak test display a bit more
593
    def report_failure(self, test, err):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
594
        self.stream.write(' FAIL %s\n%s\n'
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
595
                % (self._testTimeString(test),
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
596
                   self._error_summary(err)))
2095.4.1 by Martin Pool
Better progress bars during tests
597
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
598
    def report_known_failure(self, test, err):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
599
        self.stream.write('XFAIL %s\n%s\n'
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
600
                % (self._testTimeString(test),
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
601
                   self._error_summary(err)))
602
2095.4.1 by Martin Pool
Better progress bars during tests
603
    def report_success(self, test):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
604
        self.stream.write('   OK %s\n' % self._testTimeString(test))
2095.4.1 by Martin Pool
Better progress bars during tests
605
        for bench_called, stats in getattr(test, '_benchcalls', []):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
606
            self.stream.write('LSProf output for %s(%s, %s)\n' % bench_called)
2095.4.1 by Martin Pool
Better progress bars during tests
607
            stats.pprint(file=self.stream)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
608
        # flush the stream so that we get smooth output. This verbose mode is
609
        # used to show the output in PQM.
2095.4.1 by Martin Pool
Better progress bars during tests
610
        self.stream.flush()
611
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
612
    def report_skip(self, test, reason):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
613
        self.stream.write(' SKIP %s\n%s\n'
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
614
                % (self._testTimeString(test), reason))
2095.4.1 by Martin Pool
Better progress bars during tests
615
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
616
    def report_not_applicable(self, test, reason):
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
617
        self.stream.write('  N/A %s\n    %s\n'
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
618
                % (self._testTimeString(test), reason))
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
619
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
620
    def report_unsupported(self, test, feature):
621
        """test cannot be run because feature is missing."""
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
622
        self.stream.write("NODEP %s\n    The feature '%s' is not available.\n"
2695.1.2 by Martin Pool
_benchmarkTime should not be an attribute of ExtendedTestResult, because it only applies to the most recent test reported
623
                %(self._testTimeString(test), feature))
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
624
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
625
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
626
class TextTestRunner(object):
1185.16.58 by mbp at sourcefrog
- run all selftests by default
627
    stop_on_failure = False
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
628
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
629
    def __init__(self,
630
                 stream=sys.stderr,
631
                 descriptions=0,
632
                 verbosity=1,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
633
                 bench_history=None,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
634
                 strict=False,
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
635
                 result_decorators=None,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
636
                 ):
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
637
        """Create a TextTestRunner.
638
639
        :param result_decorators: An optional list of decorators to apply
640
            to the result object being used by the runner. Decorators are
641
            applied left to right - the first element in the list is the 
642
            innermost decorator.
643
        """
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
644
        # stream may know claim to know to write unicode strings, but in older
645
        # pythons this goes sufficiently wrong that it is a bad idea. (
646
        # specifically a built in file with encoding 'UTF-8' will still try
647
        # to encode using ascii.
648
        new_encoding = osutils.get_terminal_encoding()
4794.1.12 by Robert Collins
Create a StreamWriter helper that doesn't trigger implicit decode('ascii') on write(a_str).
649
        codec = codecs.lookup(new_encoding)
4794.1.21 by Robert Collins
Python 2.4 doesn't use CodecInfo, so do a type check on the result of codecs.lookup.
650
        if type(codec) is tuple:
651
            # Python 2.4
652
            encode = codec[0]
653
        else:
654
            encode = codec.encode
655
        stream = osutils.UnicodeOrBytesToBytesWriter(encode, stream)
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
656
        stream.encoding = new_encoding
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
657
        self.stream = stream
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
658
        self.descriptions = descriptions
659
        self.verbosity = verbosity
1819.1.2 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Add a benchmark output parameter to TextTestRunner.
660
        self._bench_history = bench_history
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
661
        self._strict = strict
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
662
        self._result_decorators = result_decorators or []
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
663
664
    def run(self, test):
665
        "Run the given test case or test suite."
2095.4.1 by Martin Pool
Better progress bars during tests
666
        if self.verbosity == 1:
667
            result_class = TextTestResult
668
        elif self.verbosity >= 2:
669
            result_class = VerboseTestResult
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
670
        original_result = result_class(self.stream,
2095.4.1 by Martin Pool
Better progress bars during tests
671
                              self.descriptions,
672
                              self.verbosity,
673
                              bench_history=self._bench_history,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
674
                              strict=self._strict,
2095.4.1 by Martin Pool
Better progress bars during tests
675
                              )
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
676
        # Signal to result objects that look at stop early policy to stop,
677
        original_result.stop_early = self.stop_on_failure
678
        result = original_result
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
679
        for decorator in self._result_decorators:
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
680
            result = decorator(result)
681
            result.stop_early = self.stop_on_failure
682
        result.startTestRun()
683
        try:
684
            test.run(result)
685
        finally:
686
            result.stopTestRun()
687
        # higher level code uses our extended protocol to determine
688
        # what exit code to give.
689
        return original_result
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
690
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
691
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
692
def iter_suite_tests(suite):
693
    """Return all tests in a suite, recursing through nested suites"""
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
694
    if isinstance(suite, unittest.TestCase):
695
        yield suite
696
    elif isinstance(suite, unittest.TestSuite):
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
697
        for item in suite:
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
698
            for r in iter_suite_tests(item):
699
                yield r
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
700
    else:
701
        raise Exception('unknown type %r for object %r'
702
                        % (type(suite), suite))
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
703
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
704
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
705
TestSkipped = testtools.testcase.TestSkipped
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
706
707
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
708
class TestNotApplicable(TestSkipped):
709
    """A test is not applicable to the situation where it was run.
710
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
711
    This is only normally raised by parameterized tests, if they find that
712
    the instance they're constructed upon does not support one aspect
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
713
    of its interface.
714
    """
715
716
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
717
# traceback._some_str fails to format exceptions that have the default
718
# __str__ which does an implicit ascii conversion. However, repr() on those
719
# objects works, for all that its not quite what the doctor may have ordered.
720
def _clever_some_str(value):
721
    try:
722
        return str(value)
723
    except:
724
        try:
725
            return repr(value).replace('\\n', '\n')
726
        except:
727
            return '<unprintable %s object>' % type(value).__name__
728
729
traceback._some_str = _clever_some_str
730
731
4794.1.16 by Robert Collins
Clearer comment on KnownFailure deprecation.
732
# deprecated - use self.knownFailure(), or self.expectFailure.
4794.1.15 by Robert Collins
Review feedback.
733
KnownFailure = testtools.testcase._ExpectedFailure
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
734
735
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
736
class UnavailableFeature(Exception):
737
    """A feature required for this test was not available.
738
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
739
    This can be considered a specialised form of SkippedTest.
740
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
741
    The feature should be used to construct the exception.
742
    """
743
744
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
745
class StringIOWrapper(object):
746
    """A wrapper around cStringIO which just adds an encoding attribute.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
747
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
748
    Internally we can check sys.stdout to see what the output encoding
749
    should be. However, cStringIO has no encoding attribute that we can
750
    set. So we wrap it instead.
751
    """
752
    encoding='ascii'
753
    _cstring = None
754
755
    def __init__(self, s=None):
756
        if s is not None:
757
            self.__dict__['_cstring'] = StringIO(s)
758
        else:
759
            self.__dict__['_cstring'] = StringIO()
760
761
    def __getattr__(self, name, getattr=getattr):
762
        return getattr(self.__dict__['_cstring'], name)
763
764
    def __setattr__(self, name, val):
765
        if name == 'encoding':
766
            self.__dict__['encoding'] = val
767
        else:
768
            return setattr(self._cstring, name, val)
769
770
4449.3.18 by Martin Pool
Fuse CLIUIFactory and TextUIFactory and deprecate the old name
771
class TestUIFactory(TextUIFactory):
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
772
    """A UI Factory for testing.
773
774
    Hide the progress bar but emit note()s.
775
    Redirect stdin.
776
    Allows get_password to be tested without real tty attached.
4580.2.1 by Martin Pool
TestUIFactory no longer needs to pretend to be its own ProgressView
777
778
    See also CannedInputUIFactory which lets you provide programmatic input in
779
    a structured way.
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
780
    """
4580.3.9 by Martin Pool
doc
781
    # TODO: Capture progress events at the model level and allow them to be
782
    # observed by tests that care.
4580.3.11 by Martin Pool
merge trunk
783
    #
4580.2.1 by Martin Pool
TestUIFactory no longer needs to pretend to be its own ProgressView
784
    # XXX: Should probably unify more with CannedInputUIFactory or a
785
    # particular configuration of TextUIFactory, or otherwise have a clearer
786
    # idea of how they're supposed to be different.
5243.1.2 by Martin
Point launchpad links in comments at production server rather than edge
787
    # See https://bugs.launchpad.net/bzr/+bug/408213
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
788
4237.2.1 by Vincent Ladeuil
Stop requiring a tty for CLIUIFactory and derivatives.
789
    def __init__(self, stdout=None, stderr=None, stdin=None):
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
790
        if stdin is not None:
791
            # We use a StringIOWrapper to be able to test various
792
            # encodings, but the user is still responsible to
793
            # encode the string and to set the encoding attribute
794
            # of StringIOWrapper.
4237.2.1 by Vincent Ladeuil
Stop requiring a tty for CLIUIFactory and derivatives.
795
            stdin = StringIOWrapper(stdin)
796
        super(TestUIFactory, self).__init__(stdin, stdout, stderr)
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
797
4237.2.1 by Vincent Ladeuil
Stop requiring a tty for CLIUIFactory and derivatives.
798
    def get_non_echoed_password(self):
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
799
        """Get password from stdin without trying to handle the echo mode"""
800
        password = self.stdin.readline()
801
        if not password:
802
            raise EOFError
803
        if password[-1] == '\n':
804
            password = password[:-1]
805
        return password
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
806
4463.1.2 by Martin Pool
merge trunk
807
    def make_progress_view(self):
808
        return NullProgressView()
809
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
810
4794.1.1 by Robert Collins
Derive bzr's TestCase from testtools.testcase.TestCase.
811
class TestCase(testtools.TestCase):
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
812
    """Base class for bzr unit tests.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
813
814
    Tests that need access to disk resources should subclass
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
815
    TestCaseInTempDir not TestCase.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
816
817
    Error and debug log messages are redirected from their usual
818
    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.
819
    retrieved by _get_log().  We use a real OS file, not an in-memory object,
820
    so that it can also capture file IO.  When the test completes this file
821
    is read into memory and removed from disk.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
822
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
823
    There are also convenience functions to invoke bzr's command-line
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
824
    routine, and to build and check bzr trees.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
825
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
826
    In addition to the usual method of overriding tearDown(), this class also
5425.2.2 by Andrew Bennetts
Remove addCleanup (testtools implements this for us), remove some unused imports.
827
    allows subclasses to register cleanup functions via addCleanup, which are
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
828
    run in order as the object is torn down.  It's less likely this will be
829
    accidentally overlooked.
830
    """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
831
5404.1.1 by Andrew Bennetts
Use StringIO rather than real files on disk for log files in tests.
832
    _log_file = None
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
833
    # record lsprof data when performing benchmark calls.
834
    _gather_lsprof_in_benchmarks = False
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
835
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
836
    def __init__(self, methodName='testMethod'):
837
        super(TestCase, self).__init__(methodName)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
838
        self._directory_isolation = True
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
839
        self.exception_handlers.insert(0,
840
            (UnavailableFeature, self._do_unsupported_or_skip))
841
        self.exception_handlers.insert(0,
842
            (TestNotApplicable, self._do_not_applicable))
4794.1.8 by Robert Collins
Move the passing of test logs to the result to be via the getDetails API and remove all public use of TestCase._get_log.
843
844
    def setUp(self):
845
        super(TestCase, self).setUp()
846
        for feature in getattr(self, '_test_needs_features', []):
847
            self.requireFeature(feature)
4794.1.7 by Robert Collins
Remove references to _get_log from test_selftest.
848
        self._log_contents = None
4794.1.6 by Robert Collins
Add a details object to bzr tests containing the test log. May currently result in failures show the log twice (but will now show the log in --subunit mode [which includes --parallel]).
849
        self.addDetail("log", content.Content(content.ContentType("text",
850
            "plain", {"charset": "utf8"}),
5387.2.3 by John Arbash Meinel
Remove unnecessary change.
851
            lambda:[self._get_log(keep_log_file=True)]))
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
852
        self._cleanEnvironment()
2095.4.1 by Martin Pool
Better progress bars during tests
853
        self._silenceUI()
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
854
        self._startLogFile()
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
855
        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)
856
        self._benchtime = None
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
857
        self._clear_hooks()
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
858
        self._track_transports()
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
859
        self._track_locks()
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
860
        self._clear_debug_flags()
3406.1.2 by Vincent Ladeuil
Fix as per Robert's review.
861
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
862
    def debug(self):
863
        # debug a frame up.
864
        import pdb
865
        pdb.Pdb().set_trace(sys._getframe().f_back)
866
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
867
    def discardDetail(self, name):
868
        """Extend the addDetail, getDetails api so we can remove a detail.
869
870
        eg. bzr always adds the 'log' detail at startup, but we don't want to
871
        include it for skipped, xfail, etc tests.
872
873
        It is safe to call this for a detail that doesn't exist, in case this
874
        gets called multiple times.
875
        """
876
        # We cheat. details is stored in __details which means we shouldn't
877
        # touch it. but getDetails() returns the dict directly, so we can
878
        # mutate it.
879
        details = self.getDetails()
880
        if name in details:
881
            del details[name]
882
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
883
    def _clear_debug_flags(self):
884
        """Prevent externally set debug flags affecting tests.
3882.6.20 by John Arbash Meinel
Clear out the InventoryEntry caches as part of the test suite.
885
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
886
        Tests that want to use debug flags can just set them in the
887
        debug_flags set during setup/teardown.
888
        """
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
889
        # Start with a copy of the current debug flags we can safely modify.
890
        self.overrideAttr(debug, 'debug_flags', set(debug.debug_flags))
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
891
        if 'allow_debug' not in selftest_debug_flags:
3302.2.1 by Andrew Bennetts
Add -Dselftest_debug debug flag.
892
            debug.debug_flags.clear()
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
893
        if 'disable_lock_checks' not in selftest_debug_flags:
894
            debug.debug_flags.add('strict_locks')
2423.1.1 by Martin Pool
fix import order dependency that broke benchmarks
895
896
    def _clear_hooks(self):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
897
        # prevent hooks affecting tests
4119.3.1 by Robert Collins
Create a single registry of all Hooks classes, removing the test suite knowledge of such hooks and allowing plugins to sensibly and safely define new hooks.
898
        self._preserved_hooks = {}
899
        for key, factory in hooks.known_hooks.items():
900
            parent, name = hooks.known_hooks_key_to_parent_and_attribute(key)
901
            current_hooks = hooks.known_hooks_key_to_object(key)
902
            self._preserved_hooks[parent] = (name, current_hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
903
        self.addCleanup(self._restoreHooks)
4119.3.1 by Robert Collins
Create a single registry of all Hooks classes, removing the test suite knowledge of such hooks and allowing plugins to sensibly and safely define new hooks.
904
        for key, factory in hooks.known_hooks.items():
905
            parent, name = hooks.known_hooks_key_to_parent_and_attribute(key)
906
            setattr(parent, name, factory())
4160.2.4 by Andrew Bennetts
Use BzrDir pre_open hook to jail request code from accessing transports other than the backing transport.
907
        # this hook should always be installed
908
        request._install_hook()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
909
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
910
    def disable_directory_isolation(self):
911
        """Turn off directory isolation checks."""
912
        self._directory_isolation = False
913
914
    def enable_directory_isolation(self):
915
        """Enable directory isolation checks."""
916
        self._directory_isolation = True
917
2095.4.1 by Martin Pool
Better progress bars during tests
918
    def _silenceUI(self):
919
        """Turn off UI for duration of test"""
920
        # by default the UI is off; tests can turn it on if they want it.
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
921
        self.overrideAttr(ui, 'ui_factory', ui.SilentUIFactory())
2095.4.1 by Martin Pool
Better progress bars during tests
922
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
923
    def _check_locks(self):
924
        """Check that all lock take/release actions have been paired."""
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
925
        # We always check for mismatched locks. If a mismatch is found, we
926
        # fail unless -Edisable_lock_checks is supplied to selftest, in which
927
        # case we just print a warning.
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
928
        # unhook:
929
        acquired_locks = [lock for action, lock in self._lock_actions
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
930
                          if action == 'acquired']
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
931
        released_locks = [lock for action, lock in self._lock_actions
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
932
                          if action == 'released']
933
        broken_locks = [lock for action, lock in self._lock_actions
934
                        if action == 'broken']
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
935
        # trivially, given the tests for lock acquistion and release, if we
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
936
        # have as many in each list, it should be ok. Some lock tests also
937
        # break some locks on purpose and should be taken into account by
938
        # considering that breaking a lock is just a dirty way of releasing it.
939
        if len(acquired_locks) != (len(released_locks) + len(broken_locks)):
940
            message = ('Different number of acquired and '
941
                       'released or broken locks. (%s, %s + %s)' %
942
                       (acquired_locks, released_locks, broken_locks))
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
943
            if not self._lock_check_thorough:
944
                # Rather than fail, just warn
945
                print "Broken test %s: %s" % (self, message)
946
                return
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
947
            self.fail(message)
948
949
    def _track_locks(self):
950
        """Track lock activity during tests."""
951
        self._lock_actions = []
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
952
        if 'disable_lock_checks' in selftest_debug_flags:
953
            self._lock_check_thorough = False
954
        else:
955
            self._lock_check_thorough = True
4985.2.1 by Vincent Ladeuil
Deploy addAttrCleanup on the whole test suite.
956
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
957
        self.addCleanup(self._check_locks)
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
958
        _mod_lock.Lock.hooks.install_named_hook('lock_acquired',
959
                                                self._lock_acquired, None)
960
        _mod_lock.Lock.hooks.install_named_hook('lock_released',
961
                                                self._lock_released, None)
962
        _mod_lock.Lock.hooks.install_named_hook('lock_broken',
963
                                                self._lock_broken, None)
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
964
965
    def _lock_acquired(self, result):
966
        self._lock_actions.append(('acquired', result))
967
968
    def _lock_released(self, result):
969
        self._lock_actions.append(('released', result))
970
4327.1.4 by Vincent Ladeuil
Fix lock test failures by taking lock breaking into account.
971
    def _lock_broken(self, result):
972
        self._lock_actions.append(('broken', result))
973
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
974
    def permit_dir(self, name):
975
        """Permit a directory to be used by this test. See permit_url."""
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
976
        name_transport = _mod_transport.get_transport(name)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
977
        self.permit_url(name)
978
        self.permit_url(name_transport.base)
979
980
    def permit_url(self, url):
981
        """Declare that url is an ok url to use in this test.
982
        
983
        Do this for memory transports, temporary test directory etc.
984
        
985
        Do not do this for the current working directory, /tmp, or any other
986
        preexisting non isolated url.
987
        """
988
        if not url.endswith('/'):
989
            url += '/'
990
        self._bzr_selftest_roots.append(url)
991
992
    def permit_source_tree_branch_repo(self):
993
        """Permit the source tree bzr is running from to be opened.
994
995
        Some code such as bzrlib.version attempts to read from the bzr branch
996
        that bzr is executing from (if any). This method permits that directory
997
        to be used in the test suite.
998
        """
999
        path = self.get_source_path()
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1000
        self.record_directory_isolation()
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1001
        try:
1002
            try:
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1003
                workingtree.WorkingTree.open(path)
4691.2.4 by Robert Collins
Handle NotBranchError when looking up source tree.
1004
            except (errors.NotBranchError, errors.NoWorkingTree):
4797.72.1 by Vincent Ladeuil
Skip tests that needs a bzr source tree when there isn't one.
1005
                raise TestSkipped('Needs a working tree of bzr sources')
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1006
        finally:
1007
            self.enable_directory_isolation()
1008
1009
    def _preopen_isolate_transport(self, transport):
1010
        """Check that all transport openings are done in the test work area."""
4634.43.20 by Andrew Bennetts
Merge from bzr.dev, resolving conflicts.
1011
        while isinstance(transport, pathfilter.PathFilteringTransport):
1012
            # Unwrap pathfiltered transports
1013
            transport = transport.server.backing_transport.clone(
1014
                transport._filter('.'))
1015
        url = transport.base
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1016
        # ReadonlySmartTCPServer_for_testing decorates the backing transport
1017
        # urls it is given by prepending readonly+. This is appropriate as the
1018
        # client shouldn't know that the server is readonly (or not readonly).
1019
        # We could register all servers twice, with readonly+ prepending, but
1020
        # that makes for a long list; this is about the same but easier to
1021
        # read.
1022
        if url.startswith('readonly+'):
1023
            url = url[len('readonly+'):]
1024
        self._preopen_isolate_url(url)
1025
1026
    def _preopen_isolate_url(self, url):
1027
        if not self._directory_isolation:
1028
            return
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1029
        if self._directory_isolation == 'record':
1030
            self._bzr_selftest_roots.append(url)
1031
            return
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1032
        # This prevents all transports, including e.g. sftp ones backed on disk
1033
        # from working unless they are explicitly granted permission. We then
1034
        # depend on the code that sets up test transports to check that they are
1035
        # appropriately isolated and enable their use by calling
1036
        # self.permit_transport()
1037
        if not osutils.is_inside_any(self._bzr_selftest_roots, url):
1038
            raise errors.BzrError("Attempt to escape test isolation: %r %r"
1039
                % (url, self._bzr_selftest_roots))
1040
4691.2.5 by Robert Collins
Handle attempted directory access to the source tree by tracing rather than post-success inspection.
1041
    def record_directory_isolation(self):
1042
        """Gather accessed directories to permit later access.
1043
        
1044
        This is used for tests that access the branch bzr is running from.
1045
        """
1046
        self._directory_isolation = "record"
1047
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
1048
    def start_server(self, transport_server, backing_server=None):
1049
        """Start transport_server for this test.
1050
1051
        This starts the server, registers a cleanup for it and permits the
1052
        server's urls to be used.
1053
        """
1054
        if backing_server is None:
4934.3.3 by Martin Pool
Rename Server.setUp to Server.start_server
1055
            transport_server.start_server()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
1056
        else:
4934.3.3 by Martin Pool
Rename Server.setUp to Server.start_server
1057
            transport_server.start_server(backing_server)
4934.3.1 by Martin Pool
Rename Server.tearDown to .stop_server
1058
        self.addCleanup(transport_server.stop_server)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1059
        # Obtain a real transport because if the server supplies a password, it
1060
        # will be hidden from the base on the client side.
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
1061
        t = _mod_transport.get_transport(transport_server.get_url())
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1062
        # Some transport servers effectively chroot the backing transport;
1063
        # others like SFTPServer don't - users of the transport can walk up the
1064
        # transport to read the entire backing transport. This wouldn't matter
1065
        # except that the workdir tests are given - and that they expect the
1066
        # server's url to point at - is one directory under the safety net. So
1067
        # Branch operations into the transport will attempt to walk up one
1068
        # directory. Chrooting all servers would avoid this but also mean that
1069
        # we wouldn't be testing directly against non-root urls. Alternatively
1070
        # getting the test framework to start the server with a backing server
1071
        # at the actual safety net directory would work too, but this then
1072
        # means that the self.get_url/self.get_transport methods would need
1073
        # to transform all their results. On balance its cleaner to handle it
1074
        # here, and permit a higher url when we have one of these transports.
1075
        if t.base.endswith('/work/'):
1076
            # we have safety net/test root/work
1077
            t = t.clone('../..')
5017.3.18 by Vincent Ladeuil
Move SmartTCPServer_for_testing and friends to bzrlib.tests.test_server
1078
        elif isinstance(transport_server,
1079
                        test_server.SmartTCPServer_for_testing):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1080
            # The smart server adds a path similar to work, which is traversed
1081
            # up from by the client. But the server is chrooted - the actual
1082
            # backing transport is not escaped from, and VFS requests to the
1083
            # root will error (because they try to escape the chroot).
1084
            t2 = t.clone('..')
1085
            while t2.base != t.base:
1086
                t = t2
1087
                t2 = t.clone('..')
1088
        self.permit_url(t.base)
1089
1090
    def _track_transports(self):
1091
        """Install checks for transport usage."""
1092
        # TestCase has no safe place it can write to.
1093
        self._bzr_selftest_roots = []
1094
        # Currently the easiest way to be sure that nothing is going on is to
1095
        # hook into bzr dir opening. This leaves a small window of error for
1096
        # transport tests, but they are well known, and we can improve on this
1097
        # step.
1098
        bzrdir.BzrDir.hooks.install_named_hook("pre_open",
1099
            self._preopen_isolate_transport, "Check bzr directories are safe.")
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
1100
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
1101
    def _ndiff_strings(self, a, b):
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
1102
        """Return ndiff between two strings containing lines.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1103
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
1104
        A trailing newline is added if missing to make the strings
1105
        print properly."""
1106
        if b and b[-1] != '\n':
1107
            b += '\n'
1108
        if a and a[-1] != '\n':
1109
            a += '\n'
1185.16.21 by Martin Pool
- tweak diff shown by assertEqualDiff
1110
        difflines = difflib.ndiff(a.splitlines(True),
1111
                                  b.splitlines(True),
1112
                                  linejunk=lambda x: False,
1113
                                  charjunk=lambda x: False)
1114
        return ''.join(difflines)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1115
2255.2.190 by Martin Pool
assertEqual can take an option message
1116
    def assertEqual(self, a, b, message=''):
2360.1.2 by John Arbash Meinel
Add an overzealous test, for Unicode support of _iter_changes.
1117
        try:
1118
            if a == b:
1119
                return
1120
        except UnicodeError, e:
1121
            # If we can't compare without getting a UnicodeError, then
1122
            # obviously they are different
1123
            mutter('UnicodeError: %s', e)
2255.2.190 by Martin Pool
assertEqual can take an option message
1124
        if message:
1125
            message += '\n'
1126
        raise AssertionError("%snot equal:\na = %s\nb = %s\n"
1127
            % (message,
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
1128
               pprint.pformat(a), pprint.pformat(b)))
2255.2.185 by Martin Pool
assertEqual uses pformat to show results
1129
1130
    assertEquals = assertEqual
1131
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.
1132
    def assertEqualDiff(self, a, b, message=None):
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
1133
        """Assert two texts are equal, if not raise an exception.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1134
1135
        This is intended for use with multi-line strings where it can
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
1136
        be hard to find the differences by eye.
1137
        """
1138
        # TODO: perhaps override assertEquals to call this for strings?
1139
        if a == b:
1140
            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.
1141
        if message is None:
1142
            message = "texts not equal:\n"
4680.1.1 by Vincent Ladeuil
Surprisingly, assertEqualDiff was wrong.
1143
        if a + '\n' == b:
1144
            message = 'first string is missing a final newline.\n'
3468.2.2 by Martin Pool
Better message re final newlines from assertEqualDiff
1145
        if a == b + '\n':
4680.1.2 by Vincent Ladeuil
Blessed be the tests that protect the imprudent :)
1146
            message = 'second string is missing a final newline.\n'
2555.3.3 by Martin Pool
Simple lock tracing in LockDir
1147
        raise AssertionError(message +
1148
                             self._ndiff_strings(a, b))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1149
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
    def assertEqualMode(self, mode, mode_test):
1151
        self.assertEqual(mode, mode_test,
1152
                         'mode mismatch %o != %o' % (mode, mode_test))
1153
4807.2.2 by John Arbash Meinel
Move all the stat comparison and platform checkning code to assertEqualStat.
1154
    def assertEqualStat(self, expected, actual):
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
1155
        """assert that expected and actual are the same stat result.
1156
1157
        :param expected: A stat result.
1158
        :param actual: A stat result.
1159
        :raises AssertionError: If the expected and actual stat values differ
1160
            other than by atime.
1161
        """
4789.24.1 by John Arbash Meinel
os.lstat() != os.fstat() for the st_ino field on windows
1162
        self.assertEqual(expected.st_size, actual.st_size,
1163
                         'st_size did not match')
1164
        self.assertEqual(expected.st_mtime, actual.st_mtime,
1165
                         'st_mtime did not match')
1166
        self.assertEqual(expected.st_ctime, actual.st_ctime,
1167
                         'st_ctime did not match')
4807.2.3 by John Arbash Meinel
It helps if you get the platform check right.
1168
        if sys.platform != 'win32':
4807.2.2 by John Arbash Meinel
Move all the stat comparison and platform checkning code to assertEqualStat.
1169
            # On Win32 both 'dev' and 'ino' cannot be trusted. In python2.4 it
1170
            # is 'dev' that varies, in python 2.5 (6?) it is st_ino that is
1171
            # odd. Regardless we shouldn't actually try to assert anything
1172
            # about their values
1173
            self.assertEqual(expected.st_dev, actual.st_dev,
1174
                             'st_dev did not match')
4789.24.1 by John Arbash Meinel
os.lstat() != os.fstat() for the st_ino field on windows
1175
            self.assertEqual(expected.st_ino, actual.st_ino,
1176
                             'st_ino did not match')
1177
        self.assertEqual(expected.st_mode, actual.st_mode,
1178
                         'st_mode did not match')
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
1179
4144.1.1 by Robert Collins
New assertLength method based on one Martin has squirreled away somewhere.
1180
    def assertLength(self, length, obj_with_len):
1181
        """Assert that obj_with_len is of length length."""
1182
        if len(obj_with_len) != length:
1183
            self.fail("Incorrect length: wanted %d, got %d for %r" % (
1184
                length, len(obj_with_len), obj_with_len))
1185
4634.85.11 by Andrew Bennetts
Suppress most errors from Branch.unlock too.
1186
    def assertLogsError(self, exception_class, func, *args, **kwargs):
1187
        """Assert that func(*args, **kwargs) quietly logs a specific exception.
1188
        """
1189
        from bzrlib import trace
1190
        captured = []
1191
        orig_log_exception_quietly = trace.log_exception_quietly
1192
        try:
1193
            def capture():
1194
                orig_log_exception_quietly()
1195
                captured.append(sys.exc_info())
1196
            trace.log_exception_quietly = capture
1197
            func(*args, **kwargs)
1198
        finally:
1199
            trace.log_exception_quietly = orig_log_exception_quietly
1200
        self.assertLength(1, captured)
1201
        err = captured[0][1]
1202
        self.assertIsInstance(err, exception_class)
1203
        return err
1204
2474.1.68 by John Arbash Meinel
Review feedback from Martin, mostly documentation updates.
1205
    def assertPositive(self, val):
1206
        """Assert that val is greater than 0."""
1207
        self.assertTrue(val > 0, 'expected a positive value, but got %s' % val)
1208
1209
    def assertNegative(self, val):
1210
        """Assert that val is less than 0."""
1211
        self.assertTrue(val < 0, 'expected a negative value, but got %s' % val)
1212
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
1213
    def assertStartsWith(self, s, prefix):
1214
        if not s.startswith(prefix):
1215
            raise AssertionError('string %r does not start with %r' % (s, prefix))
1216
1217
    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.
1218
        """Asserts that s ends with suffix."""
1219
        if not s.endswith(suffix):
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
1220
            raise AssertionError('string %r does not end with %r' % (s, suffix))
1185.16.42 by Martin Pool
- Add assertContainsRe
1221
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
1222
    def assertContainsRe(self, haystack, needle_re, flags=0):
1185.16.42 by Martin Pool
- Add assertContainsRe
1223
        """Assert that a contains something matching a regular expression."""
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
1224
        if not re.search(needle_re, haystack, flags):
2555.3.1 by Martin Pool
Better messages from assertContainsRe
1225
            if '\n' in haystack or len(haystack) > 60:
1226
                # a long string, format it in a more readable way
1227
                raise AssertionError(
1228
                        'pattern "%s" not found in\n"""\\\n%s"""\n'
1229
                        % (needle_re, haystack))
1230
            else:
1231
                raise AssertionError('pattern "%s" not found in "%s"'
1232
                        % (needle_re, haystack))
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
1233
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
1234
    def assertNotContainsRe(self, haystack, needle_re, flags=0):
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
1235
        """Assert that a does not match a regular expression"""
3940.1.1 by Ian Clatworthy
support flags when asserting re's in tests
1236
        if re.search(needle_re, haystack, flags):
1185.84.3 by Aaron Bentley
Hide diffs for old revisions in bundles
1237
            raise AssertionError('pattern "%s" found in "%s"'
1238
                    % (needle_re, haystack))
1239
5017.2.1 by Martin Pool
Add assertContainsString
1240
    def assertContainsString(self, haystack, needle):
1241
        if haystack.find(needle) == -1:
1242
            self.fail("string %r not found in '''%s'''" % (needle, haystack))
1243
1553.5.3 by Martin Pool
[patch] Rename TestCase.AssertSubset to assertSubset for consistency (Jan Hudec)
1244
    def assertSubset(self, sublist, superlist):
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
1245
        """Assert that every entry in sublist is present in superlist."""
2695.1.4 by Martin Pool
Much faster assertSubset using sets, not O(n**2)
1246
        missing = set(sublist) - set(superlist)
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
1247
        if len(missing) > 0:
2695.1.4 by Martin Pool
Much faster assertSubset using sets, not O(n**2)
1248
            raise AssertionError("value(s) %r not present in container %r" %
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
1249
                                 (missing, superlist))
1250
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
1251
    def assertListRaises(self, excClass, func, *args, **kwargs):
1252
        """Fail unless excClass is raised when the iterator from func is used.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1253
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
1254
        Many functions can return generators this makes sure
1255
        to wrap them in a list() call to make sure the whole generator
1256
        is run, and that the proper exception is raised.
1257
        """
1258
        try:
1259
            list(func(*args, **kwargs))
3287.20.1 by John Arbash Meinel
Update assertListRaises so that it returns the exception.
1260
        except excClass, e:
1261
            return e
2004.1.29 by v.ladeuil+lp at free
New tests for http range requests handling.
1262
        else:
1263
            if getattr(excClass,'__name__', None) is not None:
1264
                excName = excClass.__name__
1265
            else:
1266
                excName = str(excClass)
1267
            raise self.failureException, "%s not raised" % excName
1268
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
1269
    def assertRaises(self, excClass, callableObj, *args, **kwargs):
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1270
        """Assert that a callable raises a particular exception.
1271
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
1272
        :param excClass: As for the except statement, this may be either an
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1273
            exception class, or a tuple of classes.
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
1274
        :param callableObj: A callable, will be passed ``*args`` and
1275
            ``**kwargs``.
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
1276
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1277
        Returns the exception so that you can examine it.
1278
        """
1279
        try:
2399.1.10 by John Arbash Meinel
fix assertRaises to use the right parameter...
1280
            callableObj(*args, **kwargs)
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1281
        except excClass, e:
1282
            return e
1283
        else:
1284
            if getattr(excClass,'__name__', None) is not None:
1285
                excName = excClass.__name__
1286
            else:
2323.5.9 by Martin Pool
Clear up assertRaises (r=robert)
1287
                # probably a tuple
2323.5.5 by Martin Pool
override TestCase.assertRaises to return the exception
1288
                excName = str(excClass)
1289
            raise self.failureException, "%s not raised" % excName
1290
2220.1.13 by Marius Kruger
Remove assertNone
1291
    def assertIs(self, left, right, message=None):
1185.68.1 by Aaron Bentley
test transactions
1292
        if not (left is right):
2220.1.13 by Marius Kruger
Remove assertNone
1293
            if message is not None:
1294
                raise AssertionError(message)
1295
            else:
1296
                raise AssertionError("%r is not %r." % (left, right))
1297
1298
    def assertIsNot(self, left, right, message=None):
1299
        if (left is right):
1300
            if message is not None:
1301
                raise AssertionError(message)
1302
            else:
1303
                raise AssertionError("%r is %r." % (left, right))
2220.1.4 by Marius Kruger
* bzrlib/tests/__init__
1304
1530.1.21 by Robert Collins
Review feedback fixes.
1305
    def assertTransportMode(self, transport, path, mode):
4031.3.1 by Frank Aspell
Fixing various typos
1306
        """Fail if a path does not have mode "mode".
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1307
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
1308
        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.
1309
        """
1651.1.3 by Martin Pool
Use transport._can_roundtrip_unix_modebits to decide whether to check transport results
1310
        if not transport._can_roundtrip_unix_modebits():
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
1311
            return
1312
        path_stat = transport.stat(path)
1313
        actual_mode = stat.S_IMODE(path_stat.st_mode)
3508.1.22 by Vincent Ladeuil
Fix python2.4 failures.
1314
        self.assertEqual(mode, actual_mode,
3508.1.15 by Vincent Ladeuil
Tweak chmod bits output for easier debug.
1315
                         'mode of %r incorrect (%s != %s)'
1316
                         % (path, oct(mode), oct(actual_mode)))
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
1317
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
1318
    def assertIsSameRealPath(self, path1, path2):
1319
        """Fail if path1 and path2 points to different files"""
2823.1.11 by Vincent Ladeuil
Review feedback.
1320
        self.assertEqual(osutils.realpath(path1),
1321
                         osutils.realpath(path2),
1322
                         "apparent paths:\na = %s\nb = %s\n," % (path1, path2))
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
1323
4449.3.12 by Martin Pool
assertIsInstance can take an extra message
1324
    def assertIsInstance(self, obj, kls, msg=None):
1325
        """Fail if obj is not an instance of kls
1326
        
1327
        :param msg: Supplementary message to show if the assertion fails.
1328
        """
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1329
        if not isinstance(obj, kls):
4449.3.12 by Martin Pool
assertIsInstance can take an extra message
1330
            m = "%r is an instance of %s rather than %s" % (
1331
                obj, obj.__class__, kls)
1332
            if msg:
1333
                m += ": " + msg
1334
            self.fail(m)
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1335
3173.1.10 by Martin Pool
Move assertFileEqual to TestCase base class as it's generally usable
1336
    def assertFileEqual(self, content, path):
1337
        """Fail if path does not contain 'content'."""
1338
        self.failUnlessExists(path)
1339
        f = file(path, 'rb')
1340
        try:
1341
            s = f.read()
1342
        finally:
1343
            f.close()
1344
        self.assertEqualDiff(content, s)
1345
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
1346
    def assertDocstring(self, expected_docstring, obj):
1347
        """Fail if obj does not have expected_docstring"""
1348
        if __doc__ is None:
1349
            # With -OO the docstring should be None instead
1350
            self.assertIs(obj.__doc__, None)
1351
        else:
1352
            self.assertEqual(expected_docstring, obj.__doc__)
1353
3173.1.12 by Martin Pool
Add test_push_log_file
1354
    def failUnlessExists(self, path):
1355
        """Fail unless path or paths, which may be abs or relative, exist."""
1356
        if not isinstance(path, basestring):
1357
            for p in path:
1358
                self.failUnlessExists(p)
1359
        else:
1360
            self.failUnless(osutils.lexists(path),path+" does not exist")
1361
1362
    def failIfExists(self, path):
1363
        """Fail if path or paths, which may be abs or relative, exist."""
1364
        if not isinstance(path, basestring):
1365
            for p in path:
1366
                self.failIfExists(p)
1367
        else:
1368
            self.failIf(osutils.lexists(path),path+" exists")
1369
2592.3.243 by Martin Pool
Rename TestCase._capture_warnings
1370
    def _capture_deprecation_warnings(self, a_callable, *args, **kwargs):
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1371
        """A helper for callDeprecated and applyDeprecated.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1372
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1373
        :param a_callable: A callable to call.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1374
        :param args: The positional arguments for the callable
1375
        :param kwargs: The keyword arguments for the callable
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1376
        :return: A tuple (warnings, result). result is the result of calling
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1377
            a_callable(``*args``, ``**kwargs``).
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1378
        """
1379
        local_warnings = []
2067.3.3 by Martin Pool
merge bzr.dev and reconcile several changes, also some test fixes
1380
        def capture_warnings(msg, cls=None, stacklevel=None):
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1381
            # we've hooked into a deprecation specific callpath,
1382
            # only deprecations should getting sent via it.
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1383
            self.assertEqual(cls, DeprecationWarning)
1384
            local_warnings.append(msg)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1385
        original_warning_method = symbol_versioning.warn
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1386
        symbol_versioning.set_warning_method(capture_warnings)
1387
        try:
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1388
            result = a_callable(*args, **kwargs)
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1389
        finally:
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1390
            symbol_versioning.set_warning_method(original_warning_method)
1391
        return (local_warnings, result)
1392
1393
    def applyDeprecated(self, deprecation_format, a_callable, *args, **kwargs):
1394
        """Call a deprecated callable without warning the user.
1395
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1396
        Note that this only captures warnings raised by symbol_versioning.warn,
1397
        not other callers that go direct to the warning module.
1398
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1399
        To test that a deprecated method raises an error, do something like
1400
        this::
1401
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
1402
            self.assertRaises(errors.ReservedId,
1403
                self.applyDeprecated,
1404
                deprecated_in((1, 5, 0)),
1405
                br.append_revision,
1406
                'current:')
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1407
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1408
        :param deprecation_format: The deprecation format that the callable
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1409
            should have been deprecated with. This is the same type as the
1410
            parameter to deprecated_method/deprecated_function. If the
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1411
            callable is not deprecated with this format, an assertion error
1412
            will be raised.
1413
        :param a_callable: A callable to call. This may be a bound method or
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1414
            a regular function. It will be called with ``*args`` and
1415
            ``**kwargs``.
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1416
        :param args: The positional arguments for the callable
1417
        :param kwargs: The keyword arguments for the callable
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1418
        :return: The result of a_callable(``*args``, ``**kwargs``)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1419
        """
2592.3.243 by Martin Pool
Rename TestCase._capture_warnings
1420
        call_warnings, result = self._capture_deprecation_warnings(a_callable,
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1421
            *args, **kwargs)
1422
        expected_first_warning = symbol_versioning.deprecation_string(
1423
            a_callable, deprecation_format)
1424
        if len(call_warnings) == 0:
2255.7.47 by Robert Collins
Improve applyDeprecated warning message.
1425
            self.fail("No deprecation warning generated by call to %s" %
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1426
                a_callable)
1427
        self.assertEqual(expected_first_warning, call_warnings[0])
1428
        return result
1429
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1430
    def callCatchWarnings(self, fn, *args, **kw):
1431
        """Call a callable that raises python warnings.
1432
1433
        The caller's responsible for examining the returned warnings.
1434
1435
        If the callable raises an exception, the exception is not
1436
        caught and propagates up to the caller.  In that case, the list
1437
        of warnings is not available.
1438
1439
        :returns: ([warning_object, ...], fn_result)
1440
        """
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1441
        # XXX: This is not perfect, because it completely overrides the
1442
        # warnings filters, and some code may depend on suppressing particular
1443
        # warnings.  It's the easiest way to insulate ourselves from -Werror,
1444
        # though.  -- Andrew, 20071062
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1445
        wlist = []
3734.5.3 by Vincent Ladeuil
Martin's review feedback.
1446
        def _catcher(message, category, filename, lineno, file=None, line=None):
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1447
            # despite the name, 'message' is normally(?) a Warning subclass
1448
            # instance
1449
            wlist.append(message)
1450
        saved_showwarning = warnings.showwarning
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1451
        saved_filters = warnings.filters
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1452
        try:
1453
            warnings.showwarning = _catcher
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1454
            warnings.filters = []
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1455
            result = fn(*args, **kw)
1456
        finally:
1457
            warnings.showwarning = saved_showwarning
2592.3.246 by Andrew Bennetts
Override warnings.filters in callCatchWarnings, to insulate it from -Werror.
1458
            warnings.filters = saved_filters
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1459
        return wlist, result
1460
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1461
    def callDeprecated(self, expected, callable, *args, **kwargs):
1462
        """Assert that a callable is deprecated in a particular way.
1463
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1464
        This is a very precise test for unusual requirements. The
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1465
        applyDeprecated helper function is probably more suited for most tests
1466
        as it allows you to simply specify the deprecation format being used
1467
        and will ensure that that is issued for the function being called.
1468
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1469
        Note that this only captures warnings raised by symbol_versioning.warn,
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1470
        not other callers that go direct to the warning module.  To catch
1471
        general warnings, use callCatchWarnings.
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1472
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1473
        :param expected: a list of the deprecation warnings expected, in order
1474
        :param callable: The callable to call
1475
        :param args: The positional arguments for the callable
1476
        :param kwargs: The keyword arguments for the callable
1477
        """
2592.3.243 by Martin Pool
Rename TestCase._capture_warnings
1478
        call_warnings, result = self._capture_deprecation_warnings(callable,
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1479
            *args, **kwargs)
1480
        self.assertEqual(expected, call_warnings)
1910.2.9 by Aaron Bentley
Inroduce assertDeprecated, and use it to test old commitbuilder API
1481
        return result
1482
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1483
    def _startLogFile(self):
1484
        """Send bzr and test log messages to a temporary file.
1485
1486
        The file is removed as the test is torn down.
1487
        """
5404.1.1 by Andrew Bennetts
Use StringIO rather than real files on disk for log files in tests.
1488
        self._log_file = StringIO()
3173.1.9 by Martin Pool
tests should now call push/pop_test_log
1489
        self._log_memento = bzrlib.trace.push_log_file(self._log_file)
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1490
        self.addCleanup(self._finishLogFile)
1491
1492
    def _finishLogFile(self):
1493
        """Finished with the log file.
1494
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1495
        Close the file and delete it, unless setKeepLogfile was called.
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
1496
        """
4794.1.9 by Robert Collins
Double \n was deliberate for RandomDecorator.
1497
        if bzrlib.trace._trace_file:
1498
            # flush the log file, to get all content
1499
            bzrlib.trace._trace_file.flush()
3173.1.9 by Martin Pool
tests should now call push/pop_test_log
1500
        bzrlib.trace.pop_log_file(self._log_memento)
4794.1.9 by Robert Collins
Double \n was deliberate for RandomDecorator.
1501
        # Cache the log result and delete the file on disk
1502
        self._get_log(False)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1503
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1504
    def thisFailsStrictLockCheck(self):
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1505
        """It is known that this test would fail with -Dstrict_locks.
1506
1507
        By default, all tests are run with strict lock checking unless
1508
        -Edisable_lock_checks is supplied. However there are some tests which
1509
        we know fail strict locks at this point that have not been fixed.
1510
        They should call this function to disable the strict checking.
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1511
1512
        This should be used sparingly, it is much better to fix the locking
1513
        issues rather than papering over the problem by calling this function.
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1514
        """
1515
        debug.debug_flags.discard('strict_locks')
1516
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
1517
    def overrideAttr(self, obj, attr_name, new=_unitialized_attr):
1518
        """Overrides an object attribute restoring it after the test.
1519
1520
        :param obj: The object that will be mutated.
1521
1522
        :param attr_name: The attribute name we want to preserve/override in
1523
            the object.
1524
1525
        :param new: The optional value we want to set the attribute to.
4955.6.1 by Vincent Ladeuil
Implement test.addAttrCleanup.
1526
1527
        :returns: The actual attr value.
1528
        """
1529
        value = getattr(obj, attr_name)
1530
        # The actual value is captured by the call below
1531
        self.addCleanup(setattr, obj, attr_name, value)
4985.1.3 by Vincent Ladeuil
Change it to a more usable form.
1532
        if new is not _unitialized_attr:
1533
            setattr(obj, attr_name, new)
4955.6.1 by Vincent Ladeuil
Implement test.addAttrCleanup.
1534
        return value
1535
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1536
    def _cleanEnvironment(self):
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1537
        new_env = {
2055.1.2 by John Arbash Meinel
Clean up BZR_HOME in ENV for the test suite
1538
            'BZR_HOME': None, # Don't inherit BZR_HOME to all the tests.
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1539
            'HOME': os.getcwd(),
3638.4.4 by Mark Hammond
fix typo in comments
1540
            # bzr now uses the Win32 API and doesn't rely on APPDATA, but the
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
1541
            # tests do check our impls match APPDATA
2839.6.2 by Alexander Belchenko
changes after Martin's review
1542
            'BZR_EDITOR': None, # test_msgeditor manipulates this variable
4183.4.1 by Vincent Ladeuil
Fix bug #347130 by properly isolating test_msgeditor.MsgEditorTest tests.
1543
            'VISUAL': None,
1544
            'EDITOR': None,
1861.4.1 by Matthieu Moy
BZREMAIL renamed to BZR_EMAIL.
1545
            'BZR_EMAIL': None,
1912.2.1 by Adeodato Simó
Clear $BZREMAIL in tests, not only the newer $BZR_EMAIL, since the
1546
            'BZREMAIL': None, # may still be present in the environment
5187.2.2 by Parth Malwankar
settign userid using whoami, EMAIL or BZR_EMAIL is now mandatory.
1547
            'EMAIL': 'jrandom@example.com', # set EMAIL as bzr does not guess
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1548
            'BZR_PROGRESS_BAR': None,
3193.6.1 by Alexander Belchenko
``BZR_LOG=disable`` suppresses writing messages to .bzr.log.
1549
            'BZR_LOG': None,
3835.2.7 by Aaron Bentley
Add tests for plugins
1550
            'BZR_PLUGIN_PATH': None,
5086.1.10 by Vincent Ladeuil
Fixed as per review comments.
1551
            'BZR_DISABLE_PLUGINS': None,
5086.5.5 by Vincent Ladeuil
Use BZR_PLUGINS_AT and stop mucking with BZR_PLUGIN_PATH.
1552
            'BZR_PLUGINS_AT': None,
4766.3.7 by Vincent Ladeuil
Mix BZR_CONCURRENCY and --concurrency so both are available.
1553
            'BZR_CONCURRENCY': None,
4449.3.2 by Martin Pool
Also set TERM, COLUMNS, LINES for test cases
1554
            # Make sure that any text ui tests are consistent regardless of
1555
            # the environment the test case is run in; you may want tests that
1556
            # test other combinations.  'dumb' is a reasonable guess for tests
1557
            # going to a pipe or a StringIO.
1558
            'TERM': 'dumb',
1559
            'LINES': '25',
1560
            'COLUMNS': '80',
4747.3.7 by Vincent Ladeuil
Introduce BZR_COLUMNS since COLUMNS behaviour is too obscure.
1561
            'BZR_COLUMNS': '80',
2617.2.1 by Jelmer Vernooij
Sanitize SSH_AUTH_SOCK environment variable (#125955).
1562
            # SSH Agent
1563
            'SSH_AUTH_SOCK': None,
2167.3.6 by v.ladeuil+lp at free
Take John's comments into account and add more tests.
1564
            # Proxies
1565
            'http_proxy': None,
1566
            'HTTP_PROXY': None,
1567
            'https_proxy': None,
1568
            'HTTPS_PROXY': None,
1569
            'no_proxy': None,
1570
            'NO_PROXY': None,
1571
            'all_proxy': None,
1572
            'ALL_PROXY': None,
4229.2.1 by Vincent Ladeuil
Desambiguate comment before it became totally obscure.
1573
            # Nobody cares about ftp_proxy, FTP_PROXY AFAIK. So far at
2167.3.6 by v.ladeuil+lp at free
Take John's comments into account and add more tests.
1574
            # least. If you do (care), please update this comment
4229.2.1 by Vincent Ladeuil
Desambiguate comment before it became totally obscure.
1575
            # -- vila 20080401
2167.3.6 by v.ladeuil+lp at free
Take John's comments into account and add more tests.
1576
            'ftp_proxy': None,
1577
            'FTP_PROXY': None,
2512.3.1 by Daniel Watkins
Added BZR_REMOTE_PATH to the list of environment variables cleaned before running tests, fixing bug #111958.
1578
            'BZR_REMOTE_PATH': None,
4634.128.20 by Martin Pool
Set APPORT_DISABLE while running tests
1579
            # Generally speaking, we don't want apport reporting on crashes in
1580
            # the test envirnoment unless we're specifically testing apport,
1581
            # so that it doesn't leak into the real system environment.  We
1582
            # use an env var so it propagates to subprocesses.
1583
            'APPORT_DISABLE': '1',
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1584
        }
5017.2.2 by Martin Pool
Add import tariff tests
1585
        self._old_env = {}
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1586
        self.addCleanup(self._restoreEnvironment)
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
1587
        for name, value in new_env.iteritems():
1588
            self._captureVar(name, value)
1589
1590
    def _captureVar(self, name, newvalue):
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1591
        """Set an environment variable, and reset it when finished."""
5017.2.2 by Martin Pool
Add import tariff tests
1592
        self._old_env[name] = osutils.set_or_unset_env(name, newvalue)
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1593
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1594
    def _restoreEnvironment(self):
5017.2.2 by Martin Pool
Add import tariff tests
1595
        for name, value in self._old_env.iteritems():
1963.1.6 by John Arbash Meinel
Use the new helper function in a few places
1596
            osutils.set_or_unset_env(name, value)
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
1597
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1598
    def _restoreHooks(self):
4119.3.1 by Robert Collins
Create a single registry of all Hooks classes, removing the test suite knowledge of such hooks and allowing plugins to sensibly and safely define new hooks.
1599
        for klass, (name, hooks) in self._preserved_hooks.items():
1600
            setattr(klass, name, hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1601
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1602
    def knownFailure(self, reason):
1603
        """This test has failed for some known reason."""
1604
        raise KnownFailure(reason)
1605
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1606
    def _suppress_log(self):
1607
        """Remove the log info from details."""
1608
        self.discardDetail('log')
1609
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1610
    def _do_skip(self, result, reason):
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1611
        self._suppress_log()
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1612
        addSkip = getattr(result, 'addSkip', None)
1613
        if not callable(addSkip):
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
1614
            result.addSuccess(result)
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1615
        else:
1616
            addSkip(self, reason)
1617
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1618
    @staticmethod
1619
    def _do_known_failure(self, result, e):
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1620
        self._suppress_log()
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
1621
        err = sys.exc_info()
1622
        addExpectedFailure = getattr(result, 'addExpectedFailure', None)
1623
        if addExpectedFailure is not None:
1624
            addExpectedFailure(self, err)
1625
        else:
1626
            result.addSuccess(self)
1627
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1628
    @staticmethod
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
1629
    def _do_not_applicable(self, result, e):
4780.1.5 by Robert Collins
Fix fallback of NotApplicable to Skip.
1630
        if not e.args:
1631
            reason = 'No reason given'
1632
        else:
1633
            reason = e.args[0]
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1634
        self._suppress_log ()
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
1635
        addNotApplicable = getattr(result, 'addNotApplicable', None)
1636
        if addNotApplicable is not None:
1637
            result.addNotApplicable(self, reason)
1638
        else:
1639
            self._do_skip(result, reason)
1640
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1641
    @staticmethod
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1642
    def _report_skip(self, result, err):
1643
        """Override the default _report_skip.
1644
1645
        We want to strip the 'log' detail. If we waint until _do_skip, it has
1646
        already been formatted into the 'reason' string, and we can't pull it
1647
        out again.
1648
        """
1649
        self._suppress_log()
1650
        super(TestCase, self)._report_skip(self, result, err)
1651
1652
    @staticmethod
1653
    def _report_expected_failure(self, result, err):
1654
        """Strip the log.
1655
1656
        See _report_skip for motivation.
1657
        """
1658
        self._suppress_log()
1659
        super(TestCase, self)._report_expected_failure(self, result, err)
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1660
1661
    @staticmethod
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1662
    def _do_unsupported_or_skip(self, result, e):
1663
        reason = e.args[0]
5387.2.1 by John Arbash Meinel
Filter out the 'log' information for skipped, xfail, and n/a.
1664
        self._suppress_log()
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
1665
        addNotSupported = getattr(result, 'addNotSupported', None)
1666
        if addNotSupported is not None:
1667
            result.addNotSupported(self, reason)
1668
        else:
1669
            self._do_skip(result, reason)
1670
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)
1671
    def time(self, callable, *args, **kwargs):
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1672
        """Run callable and accrue the time it takes to the benchmark time.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1673
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1674
        If lsprofiling is enabled (i.e. by --lsprof-time to bzr selftest) then
1675
        this will cause lsprofile statistics to be gathered and stored in
1676
        self._benchcalls.
1677
        """
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)
1678
        if self._benchtime is None:
4794.1.10 by Robert Collins
Add benchmark time details object.
1679
            self.addDetail('benchtime', content.Content(content.ContentType(
1680
                "text", "plain"), lambda:[str(self._benchtime)]))
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)
1681
            self._benchtime = 0
1682
        start = time.time()
1683
        try:
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1684
            if not self._gather_lsprof_in_benchmarks:
1685
                return callable(*args, **kwargs)
1686
            else:
1687
                # record this benchmark
1688
                ret, stats = bzrlib.lsprof.profile(callable, *args, **kwargs)
1689
                stats.sort()
1690
                self._benchcalls.append(((callable, args, kwargs), stats))
1691
                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)
1692
        finally:
1693
            self._benchtime += time.time() - start
1694
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1695
    def log(self, *args):
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
1696
        mutter(*args)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1697
4794.1.9 by Robert Collins
Double \n was deliberate for RandomDecorator.
1698
    def _get_log(self, keep_log_file=False):
4794.1.15 by Robert Collins
Review feedback.
1699
        """Internal helper to get the log from bzrlib.trace for this test.
1700
1701
        Please use self.getDetails, or self.get_log to access this in test case
1702
        code.
2725.1.1 by Robert Collins
Add -Devil flag to highlight the use of problematic API calls.
1703
1704
        :param keep_log_file: When True, if the log is still a file on disk
1705
            leave it as a file on disk. When False, if the log is still a file
1706
            on disk, the log file is deleted and the log preserved as
1707
            self._log_contents.
1708
        :return: A string containing the log.
1709
        """
4794.1.7 by Robert Collins
Remove references to _get_log from test_selftest.
1710
        if self._log_contents is not None:
4794.1.9 by Robert Collins
Double \n was deliberate for RandomDecorator.
1711
            try:
1712
                self._log_contents.decode('utf8')
1713
            except UnicodeDecodeError:
1714
                unicodestr = self._log_contents.decode('utf8', 'replace')
1715
                self._log_contents = unicodestr.encode('utf8')
4794.1.7 by Robert Collins
Remove references to _get_log from test_selftest.
1716
            return self._log_contents
5404.1.1 by Andrew Bennetts
Use StringIO rather than real files on disk for log files in tests.
1717
        if self._log_file is not None:
1718
            log_contents = self._log_file.getvalue()
4794.1.9 by Robert Collins
Double \n was deliberate for RandomDecorator.
1719
            try:
1720
                log_contents.decode('utf8')
1721
            except UnicodeDecodeError:
1722
                unicodestr = log_contents.decode('utf8', 'replace')
1723
                log_contents = unicodestr.encode('utf8')
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1724
            if not keep_log_file:
4794.1.9 by Robert Collins
Double \n was deliberate for RandomDecorator.
1725
                self._log_file = None
1726
                # Permit multiple calls to get_log until we clean it up in
1727
                # finishLogFile
1927.3.1 by Carl Friedrich Bolz
Throw away on-disk logfile when possible.
1728
                self._log_contents = log_contents
1729
            return log_contents
1730
        else:
5404.1.1 by Andrew Bennetts
Use StringIO rather than real files on disk for log files in tests.
1731
            return "No log file content."
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1732
4794.1.15 by Robert Collins
Review feedback.
1733
    def get_log(self):
1734
        """Get a unicode string containing the log from bzrlib.trace.
1735
1736
        Undecodable characters are replaced.
1737
        """
1738
        return u"".join(self.getDetails()['log'].iter_text())
1739
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1740
    def requireFeature(self, feature):
1741
        """This test requires a specific feature is available.
1742
1743
        :raises UnavailableFeature: When feature is not available.
1744
        """
1745
        if not feature.available():
1746
            raise UnavailableFeature(feature)
1747
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1748
    def _run_bzr_autosplit(self, args, retcode, encoding, stdin,
1749
            working_dir):
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1750
        """Run bazaar command line, splitting up a string command line."""
1751
        if isinstance(args, basestring):
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
1752
            # shlex don't understand unicode strings,
1753
            # so args should be plain string (bialix 20070906)
1754
            args = list(shlex.split(str(args)))
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1755
        return self._run_bzr_core(args, retcode=retcode,
1756
                encoding=encoding, stdin=stdin, working_dir=working_dir,
1757
                )
1758
1759
    def _run_bzr_core(self, args, retcode, encoding, stdin,
1760
            working_dir):
4634.90.2 by Andrew Bennetts
Clear chk_map page cache in TestCase._run_bzr_core, causes blackbox.test_log to fail without fix in previous revision.
1761
        # Clear chk_map page cache, because the contents are likely to mask
1762
        # locking errors.
1763
        chk_map.clear_cache()
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
1764
        if encoding is None:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
1765
            encoding = osutils.get_user_encoding()
1185.85.8 by John Arbash Meinel
Adding wrapper for sys.stdout so we can set the output encoding. Adding tests that 'bzr log' handles multiple encodings properly
1766
        stdout = StringIOWrapper()
1767
        stderr = StringIOWrapper()
1768
        stdout.encoding = encoding
1769
        stderr.encoding = encoding
1770
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1771
        self.log('run bzr: %r', args)
1185.43.5 by Martin Pool
Update log message quoting
1772
        # FIXME: don't call into logging here
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1773
        handler = logging.StreamHandler(stderr)
1774
        handler.setLevel(logging.INFO)
1775
        logger = logging.getLogger('')
1776
        logger.addHandler(handler)
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
1777
        old_ui_factory = ui.ui_factory
1778
        ui.ui_factory = TestUIFactory(stdin=stdin, stdout=stdout, stderr=stderr)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1779
1780
        cwd = None
1781
        if working_dir is not None:
1782
            cwd = osutils.getcwd()
1783
            os.chdir(working_dir)
1784
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1785
        try:
4815.3.5 by Gordon Tyler
Fixed try/except/finally to try/try/except/finally for Python 2.4 compatibility.
1786
            try:
1787
                result = self.apply_redirected(ui.ui_factory.stdin,
1788
                    stdout, stderr,
1789
                    bzrlib.commands.run_bzr_catch_user_errors,
1790
                    args)
1791
            except KeyboardInterrupt:
4815.3.8 by Vincent Ladeuil
Fix too long lines.
1792
                # Reraise KeyboardInterrupt with contents of redirected stdout
1793
                # and stderr as arguments, for tests which are interested in
1794
                # stdout and stderr and are expecting the exception.
4815.3.5 by Gordon Tyler
Fixed try/except/finally to try/try/except/finally for Python 2.4 compatibility.
1795
                out = stdout.getvalue()
1796
                err = stderr.getvalue()
1797
                if out:
1798
                    self.log('output:\n%r', out)
1799
                if err:
1800
                    self.log('errors:\n%r', err)
1801
                raise KeyboardInterrupt(out, err)
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
1802
        finally:
1803
            logger.removeHandler(handler)
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
1804
            ui.ui_factory = old_ui_factory
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1805
            if cwd is not None:
1806
                os.chdir(cwd)
1685.1.69 by Wouter van Heyst
merge bzr.dev 1740
1807
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1808
        out = stdout.getvalue()
1809
        err = stderr.getvalue()
1810
        if out:
1185.85.72 by John Arbash Meinel
Fix some of the tests.
1811
            self.log('output:\n%r', out)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1812
        if err:
1185.85.72 by John Arbash Meinel
Fix some of the tests.
1813
            self.log('errors:\n%r', err)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1814
        if retcode is not None:
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
1815
            self.assertEquals(retcode, result,
1816
                              message='Unexpected return code')
4665.5.15 by Vincent Ladeuil
Catch the retcode for all commands.
1817
        return result, out, err
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1818
2830.2.5 by Martin Pool
Deprecated ``run_bzr_decode``; use the new ``output_encoding`` parameter to
1819
    def run_bzr(self, args, retcode=0, encoding=None, stdin=None,
1820
                working_dir=None, error_regexes=[], output_encoding=None):
1119 by Martin Pool
doc
1821
        """Invoke bzr, as if it were run from the command line.
1822
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1823
        The argument list should not include the bzr program name - the
1824
        first argument is normally the bzr command.  Arguments may be
1825
        passed in three ways:
1826
1827
        1- A list of strings, eg ["commit", "a"].  This is recommended
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1828
        when the command contains whitespace or metacharacters, or
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1829
        is built up at run time.
1830
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1831
        2- A single string, eg "add a".  This is the most convenient
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1832
        for hardcoded commands.
1833
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
1834
        This runs bzr through the interface that catches and reports
1835
        errors, and with logging set to something approximating the
1836
        default, so that error reporting can be checked.
1837
1119 by Martin Pool
doc
1838
        This should be the main method for tests that want to exercise the
1839
        overall behavior of the bzr application (rather than a unit test
1840
        or a functional test of the library.)
1841
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
1842
        This sends the stdout/stderr results into the test's log,
1843
        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.
1844
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1845
        :keyword stdin: A string to be used as stdin for the command.
2399.1.17 by John Arbash Meinel
[merge] bzr.dev 2562
1846
        :keyword retcode: The status code the command should return;
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1847
            default 0.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1848
        :keyword working_dir: The directory to run the command in
2399.1.17 by John Arbash Meinel
[merge] bzr.dev 2562
1849
        :keyword error_regexes: A list of expected error messages.  If
1850
            specified they must be seen in the error output of the command.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
1851
        """
4665.5.15 by Vincent Ladeuil
Catch the retcode for all commands.
1852
        retcode, out, err = self._run_bzr_autosplit(
2830.2.5 by Martin Pool
Deprecated ``run_bzr_decode``; use the new ``output_encoding`` parameter to
1853
            args=args,
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1854
            retcode=retcode,
2830.2.5 by Martin Pool
Deprecated ``run_bzr_decode``; use the new ``output_encoding`` parameter to
1855
            encoding=encoding,
1856
            stdin=stdin,
1857
            working_dir=working_dir,
2530.3.2 by Martin Pool
Refactoring run_bzr code into more of a common base.
1858
            )
4325.4.6 by Vincent Ladeuil
Fixed as per John's and Markus reviews.
1859
        self.assertIsInstance(error_regexes, (list, tuple))
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
1860
        for regex in error_regexes:
1861
            self.assertContainsRe(err, regex)
1862
        return out, err
1863
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.
1864
    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
1865
        """Run bzr, and check that stderr contains the supplied regexes
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1866
1867
        :param error_regexes: Sequence of regular expressions which
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
1868
            must each be found in the error output. The relative ordering
1869
            is not enforced.
1870
        :param args: command-line arguments for bzr
1871
        :param kwargs: Keyword arguments which are interpreted by run_bzr
1872
            This function changes the default value of retcode to be 3,
1873
            since in most cases this is run when you expect bzr to fail.
2581.1.1 by Martin Pool
Merge more runbzr cleanups
1874
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1875
        :return: (out, err) The actual output of running the command (in case
1876
            you want to do more inspection)
1877
1878
        Examples of use::
1879
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
1880
            # Make sure that commit is failing because there is nothing to do
1881
            self.run_bzr_error(['no changes to commit'],
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
1882
                               ['commit', '-m', 'my commit comment'])
1711.7.11 by John Arbash Meinel
Clean up the documentation for run_bzr_error on Martin's suggestion.
1883
            # Make sure --strict is handling an unknown file, rather than
1884
            # giving us the 'nothing to do' error
1885
            self.build_tree(['unknown'])
1886
            self.run_bzr_error(['Commit refused because there are unknown files'],
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
1887
                               ['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
1888
        """
1889
        kwargs.setdefault('retcode', 3)
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
1890
        kwargs['error_regexes'] = error_regexes
1891
        out, err = self.run_bzr(*args, **kwargs)
1711.2.71 by John Arbash Meinel
Default to retcode=3, and add a test for run_bzr_error
1892
        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.
1893
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1894
    def run_bzr_subprocess(self, *args, **kwargs):
1895
        """Run bzr in a subprocess for testing.
1896
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1897
        This starts a new Python interpreter and runs bzr in there.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1898
        This should only be used for tests that have a justifiable need for
1899
        this isolation: e.g. they are testing startup time, or signal
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1900
        handling, or early startup code, etc.  Subprocess code can't be
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1901
        profiled or debugged so easily.
1752.1.7 by Aaron Bentley
Stop using shlex in run_bzr_subprocess
1902
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1903
        :keyword retcode: The status code that is expected.  Defaults to 0.  If
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
1904
            None is supplied, the status code is not checked.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1905
        :keyword env_changes: A dictionary which lists changes to environment
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
1906
            variables. A value of None will unset the env variable.
1907
            The values must be strings. The change will only occur in the
1908
            child, so you don't need to fix the environment after running.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
1909
        :keyword universal_newlines: Convert CRLF => LF
1910
        :keyword allow_plugins: By default the subprocess is run with
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1911
            --no-plugins to ensure test reproducibility. Also, it is possible
2067.2.2 by John Arbash Meinel
Review comments from Robert
1912
            for system-wide plugins to create unexpected output on stderr,
1913
            which can cause unnecessary test failures.
1752.1.6 by Aaron Bentley
Rename run_bzr_external -> run_bzr_subprocess, add docstring
1914
        """
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
1915
        env_changes = kwargs.get('env_changes', {})
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1916
        working_dir = kwargs.get('working_dir', None)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1917
        allow_plugins = kwargs.get('allow_plugins', False)
2665.4.1 by Aaron Bentley
teach run_bzr_subprocess to accept either a list of strings or a string
1918
        if len(args) == 1:
1919
            if isinstance(args[0], list):
1920
                args = args[0]
1921
            elif isinstance(args[0], basestring):
1922
                args = list(shlex.split(args[0]))
1923
        else:
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
1924
            raise ValueError("passing varargs to run_bzr_subprocess")
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1925
        process = self.start_bzr_subprocess(args, env_changes=env_changes,
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1926
                                            working_dir=working_dir,
1927
                                            allow_plugins=allow_plugins)
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1928
        # We distinguish between retcode=None and retcode not passed.
1929
        supplied_retcode = kwargs.get('retcode', 0)
1930
        return self.finish_bzr_subprocess(process, retcode=supplied_retcode,
1931
            universal_newlines=kwargs.get('universal_newlines', False),
1932
            process_args=args)
1933
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
1934
    def start_bzr_subprocess(self, process_args, env_changes=None,
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1935
                             skip_if_plan_to_signal=False,
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1936
                             working_dir=None,
1937
                             allow_plugins=False):
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1938
        """Start bzr in a subprocess for testing.
1939
1940
        This starts a new Python interpreter and runs bzr in there.
1941
        This should only be used for tests that have a justifiable need for
1942
        this isolation: e.g. they are testing startup time, or signal
1943
        handling, or early startup code, etc.  Subprocess code can't be
1944
        profiled or debugged so easily.
1945
1946
        :param process_args: a list of arguments to pass to the bzr executable,
2399.1.7 by John Arbash Meinel
Cleanup bzrlib/benchmarks/* so that everything at least has a valid doc string.
1947
            for example ``['--version']``.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1948
        :param env_changes: A dictionary which lists changes to environment
1949
            variables. A value of None will unset the env variable.
1950
            The values must be strings. The change will only occur in the
1951
            child, so you don't need to fix the environment after running.
5340.10.1 by Martin
Correct check on whether signalling subprocess is supported
1952
        :param skip_if_plan_to_signal: raise TestSkipped when true and system
1953
            doesn't support signalling subprocesses.
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1954
        :param allow_plugins: If False (default) pass --no-plugins to bzr.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1955
1956
        :returns: Popen object for the started process.
1957
        """
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
1958
        if skip_if_plan_to_signal:
5340.10.1 by Martin
Correct check on whether signalling subprocess is supported
1959
            if os.name != "posix":
1960
                raise TestSkipped("Sending signals not supported")
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
1961
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
1962
        if env_changes is None:
1963
            env_changes = {}
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1964
        old_env = {}
1965
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
1966
        def cleanup_environment():
1967
            for env_var, value in env_changes.iteritems():
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1968
                old_env[env_var] = osutils.set_or_unset_env(env_var, value)
1969
1970
        def restore_environment():
1971
            for env_var, value in old_env.iteritems():
1972
                osutils.set_or_unset_env(env_var, value)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
1973
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
1974
        bzr_path = self.get_bzr_path()
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1975
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1976
        cwd = None
1977
        if working_dir is not None:
1978
            cwd = osutils.getcwd()
1979
            os.chdir(working_dir)
1980
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1981
        try:
1982
            # win32 subprocess doesn't support preexec_fn
1983
            # so we will avoid using it on all platforms, just to
1984
            # make sure the code path is used, and we don't break on win32
1985
            cleanup_environment()
3616.2.1 by Mark Hammond
Fix how blackbox tests start bzr from frozen executables.
1986
            command = [sys.executable]
1987
            # frozen executables don't need the path to bzr
3616.2.7 by Mark Hammond
prefer getattr() over hasattr()
1988
            if getattr(sys, "frozen", None) is None:
3616.2.1 by Mark Hammond
Fix how blackbox tests start bzr from frozen executables.
1989
                command.append(bzr_path)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
1990
            if not allow_plugins:
1991
                command.append('--no-plugins')
1992
            command.extend(process_args)
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
1993
            process = self._popen(command, stdin=subprocess.PIPE,
1994
                                  stdout=subprocess.PIPE,
1995
                                  stderr=subprocess.PIPE)
1963.1.7 by John Arbash Meinel
Switch to directly setting the env, and cleaning it up. So that it works on all platforms
1996
        finally:
1997
            restore_environment()
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
1998
            if cwd is not None:
1999
                os.chdir(cwd)
2000
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2001
        return process
2002
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2003
    def _popen(self, *args, **kwargs):
2004
        """Place a call to Popen.
2067.2.2 by John Arbash Meinel
Review comments from Robert
2005
2006
        Allows tests to override this method to intercept the calls made to
2007
        Popen for introspection.
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2008
        """
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2009
        return subprocess.Popen(*args, **kwargs)
2067.2.1 by John Arbash Meinel
Change run_bzr_subprocess to default to supplying --no-plugins.
2010
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2011
    def get_source_path(self):
2012
        """Return the path of the directory containing bzrlib."""
2013
        return os.path.dirname(os.path.dirname(bzrlib.__file__))
2014
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
2015
    def get_bzr_path(self):
2018.1.9 by Andrew Bennetts
Implement ParamikoVendor.connect_ssh
2016
        """Return the path of the 'bzr' executable for this test suite."""
5340.3.2 by Martin
Correct TestCase.get_bzr_path when bzrlib is in the cwd
2017
        bzr_path = os.path.join(self.get_source_path(), "bzr")
2018.1.1 by Andrew Bennetts
Make bzr+ssh:// actually work (at least with absolute paths).
2018
        if not os.path.isfile(bzr_path):
2019
            # We are probably installed. Assume sys.argv is the right file
2020
            bzr_path = sys.argv[0]
2021
        return bzr_path
2022
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2023
    def finish_bzr_subprocess(self, process, retcode=0, send_signal=None,
2024
                              universal_newlines=False, process_args=None):
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2025
        """Finish the execution of process.
2026
2027
        :param process: the Popen object returned from start_bzr_subprocess.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2028
        :param retcode: The status code that is expected.  Defaults to 0.  If
2029
            None is supplied, the status code is not checked.
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2030
        :param send_signal: an optional signal to send to the process.
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2031
        :param universal_newlines: Convert CRLF => LF
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2032
        :returns: (stdout, stderr)
2033
        """
2034
        if send_signal is not None:
2035
            os.kill(process.pid, send_signal)
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
2036
        out, err = process.communicate()
2037
2038
        if universal_newlines:
2039
            out = out.replace('\r\n', '\n')
2040
            err = err.replace('\r\n', '\n')
2041
2042
        if retcode is not None and retcode != process.returncode:
2043
            if process_args is None:
2044
                process_args = "(unknown args)"
2045
            mutter('Output of bzr %s:\n%s', process_args, out)
2046
            mutter('Error for bzr %s:\n%s', process_args, err)
2047
            self.fail('Command bzr %s failed with retcode %s != %s'
2048
                      % (process_args, retcode, process.returncode))
2049
        return [out, err]
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
2050
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2051
    def check_inventory_shape(self, inv, shape):
1291 by Martin Pool
- add test for moving files between directories
2052
        """Compare an inventory to a list of expected names.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2053
2054
        Fail if they are not precisely equal.
2055
        """
2056
        extras = []
2057
        shape = list(shape)             # copy
2058
        for path, ie in inv.entries():
2059
            name = path.replace('\\', '/')
2545.3.1 by James Westby
Fix detection of directory entries in the inventory.
2060
            if ie.kind == 'directory':
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2061
                name = name + '/'
2062
            if name in shape:
2063
                shape.remove(name)
2064
            else:
2065
                extras.append(name)
2066
        if shape:
2067
            self.fail("expected paths not found in inventory: %r" % shape)
2068
        if extras:
2069
            self.fail("unexpected paths found in inventory: %r" % extras)
2070
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2071
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
2072
                         a_callable=None, *args, **kwargs):
2073
        """Call callable with redirected std io pipes.
2074
2075
        Returns the return code."""
2076
        if not callable(a_callable):
2077
            raise ValueError("a_callable must be callable.")
2078
        if stdin is None:
2079
            stdin = StringIO("")
2080
        if stdout is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
2081
            if getattr(self, "_log_file", None) is not None:
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
2082
                stdout = self._log_file
2083
            else:
2084
                stdout = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2085
        if stderr is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
2086
            if getattr(self, "_log_file", None is not None):
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
2087
                stderr = self._log_file
2088
            else:
2089
                stderr = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2090
        real_stdin = sys.stdin
2091
        real_stdout = sys.stdout
2092
        real_stderr = sys.stderr
2093
        try:
2094
            sys.stdout = stdout
2095
            sys.stderr = stderr
2096
            sys.stdin = stdin
1160 by Martin Pool
- tiny refactoring
2097
            return a_callable(*args, **kwargs)
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2098
        finally:
2099
            sys.stdout = real_stdout
2100
            sys.stderr = real_stderr
2101
            sys.stdin = real_stdin
2102
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
2103
    def reduceLockdirTimeout(self):
2104
        """Reduce the default lock timeout for the duration of the test, so that
2105
        if LockContention occurs during a test, it does so quickly.
2106
2107
        Tests that expect to provoke LockContention errors should call this.
2108
        """
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
2109
        self.overrideAttr(bzrlib.lockdir, '_DEFAULT_TIMEOUT_SECONDS', 0)
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
2110
2717.1.1 by Lukáš Lalinsky
Use UTF-8 encoded StringIO for log tests to avoid failures on non-ASCII committer names.
2111
    def make_utf8_encoded_stringio(self, encoding_type=None):
2112
        """Return a StringIOWrapper instance, that will encode Unicode
2113
        input to UTF-8.
2114
        """
2115
        if encoding_type is None:
2116
            encoding_type = 'strict'
2117
        sio = StringIO()
2118
        output_encoding = 'utf-8'
2119
        sio = codecs.getwriter(output_encoding)(sio, errors=encoding_type)
2120
        sio.encoding = output_encoding
2121
        return sio
2122
4476.3.32 by Andrew Bennetts
Move disable_verb into base TestCase to remove duplication, fix trivial test failures due to new insert_stream verb in test_remote (and also add some trivial tests for the new verb).
2123
    def disable_verb(self, verb):
2124
        """Disable a smart server verb for one test."""
2125
        from bzrlib.smart import request
2126
        request_handlers = request.request_handlers
2127
        orig_method = request_handlers.get(verb)
2128
        request_handlers.remove(verb)
4985.2.1 by Vincent Ladeuil
Deploy addAttrCleanup on the whole test suite.
2129
        self.addCleanup(request_handlers.register, verb, orig_method)
4476.3.32 by Andrew Bennetts
Move disable_verb into base TestCase to remove duplication, fix trivial test failures due to new insert_stream verb in test_remote (and also add some trivial tests for the new verb).
2130
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2131
4070.3.1 by Robert Collins
Alter branch sprouting with an alternate fix for stacked branches that does not require multiple copy_content_into and set_parent calls, reducing IO and round trips.
2132
class CapturedCall(object):
2133
    """A helper for capturing smart server calls for easy debug analysis."""
2134
2135
    def __init__(self, params, prefix_length):
2136
        """Capture the call with params and skip prefix_length stack frames."""
2137
        self.call = params
2138
        import traceback
2139
        # The last 5 frames are the __init__, the hook frame, and 3 smart
2140
        # client frames. Beyond this we could get more clever, but this is good
2141
        # enough for now.
2142
        stack = traceback.extract_stack()[prefix_length:-5]
2143
        self.stack = ''.join(traceback.format_list(stack))
2144
2145
    def __str__(self):
2146
        return self.call.method
2147
2148
    def __repr__(self):
2149
        return self.call.method
2150
2151
    def stack(self):
2152
        return self.stack
2153
2154
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2155
class TestCaseWithMemoryTransport(TestCase):
2156
    """Common test class for tests that do not need disk resources.
2157
2158
    Tests that need disk resources should derive from TestCaseWithTransport.
2159
2160
    TestCaseWithMemoryTransport sets the TEST_ROOT variable for all bzr tests.
2161
2162
    For TestCaseWithMemoryTransport the test_home_dir is set to the name of
2163
    a directory which does not exist. This serves to help ensure test isolation
2164
    is preserved. test_dir is set to the TEST_ROOT, as is cwd, because they
2165
    must exist. However, TestCaseWithMemoryTransport does not offer local
2166
    file defaults for the transport in tests, nor does it obey the command line
2167
    override, so tests that accidentally write to the common directory should
2168
    be rare.
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
2169
2170
    :cvar TEST_ROOT: Directory containing all temporary directories, plus
2171
    a .bzr directory that stops us ascending higher into the filesystem.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2172
    """
2173
2174
    TEST_ROOT = None
2175
    _TEST_NAME = 'test'
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2176
1986.2.5 by Robert Collins
Unbreak transport tests.
2177
    def __init__(self, methodName='runTest'):
3128.1.3 by Vincent Ladeuil
Since we are there s/parameteris.*/parameteriz&/.
2178
        # allow test parameterization after test construction and before test
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2179
        # execution. Variables that the parameterizer sets need to be
1986.2.5 by Robert Collins
Unbreak transport tests.
2180
        # ones that are not set by setUp, or setUp will trash them.
2181
        super(TestCaseWithMemoryTransport, self).__init__(methodName)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2182
        self.vfs_transport_factory = default_transport
2183
        self.transport_server = None
1986.2.5 by Robert Collins
Unbreak transport tests.
2184
        self.transport_readonly_server = None
2018.5.44 by Andrew Bennetts
Small changes to help a couple more tests pass.
2185
        self.__vfs_server = None
1986.2.5 by Robert Collins
Unbreak transport tests.
2186
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2187
    def get_transport(self, relpath=None):
2188
        """Return a writeable transport.
2189
2190
        This transport is for the test scratch space relative to
2592.2.5 by Jonathan Lange
Make UnicodeFilename feature less insane. Add a simple test for it too.
2191
        "self._test_root"
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2192
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2193
        :param relpath: a path relative to the base url.
2194
        """
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2195
        t = _mod_transport.get_transport(self.get_url(relpath))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2196
        self.assertFalse(t.is_readonly())
2197
        return t
2198
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2199
    def get_readonly_transport(self, relpath=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2200
        """Return a readonly transport for the test scratch space
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2201
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2202
        This can be used to test that operations which should only need
2203
        readonly access in fact do not try to write.
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2204
2205
        :param relpath: a path relative to the base url.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2206
        """
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2207
        t = _mod_transport.get_transport(self.get_readonly_url(relpath))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2208
        self.assertTrue(t.is_readonly())
2209
        return t
2210
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
2211
    def create_transport_readonly_server(self):
2212
        """Create a transport server from class defined at init.
2213
2145.1.1 by mbp at sourcefrog
merge urllib keepalive etc
2214
        This is mostly a hook for daughter classes.
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
2215
        """
2216
        return self.transport_readonly_server()
2217
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2218
    def get_readonly_server(self):
2219
        """Get the server instance for the readonly transport
2220
2221
        This is useful for some tests with specific servers to do diagnostics.
2222
        """
2223
        if self.__readonly_server is None:
2224
            if self.transport_readonly_server is None:
2225
                # readonly decorator requested
5017.3.23 by Vincent Ladeuil
selftest -s bt.test_bzrdir passing
2226
                self.__readonly_server = test_server.ReadonlyServer()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2227
            else:
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2228
                # explicit readonly transport.
2004.1.19 by v.ladeuil+lp at free
Test protocol version in http responses.
2229
                self.__readonly_server = self.create_transport_readonly_server()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2230
            self.start_server(self.__readonly_server,
2231
                self.get_vfs_only_server())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2232
        return self.__readonly_server
2233
2234
    def get_readonly_url(self, relpath=None):
2235
        """Get a URL for the readonly transport.
2236
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2237
        This will either be backed by '.' or a decorator to the transport
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2238
        used by self.get_url()
2239
        relpath provides for clients to get a path relative to the base url.
2240
        These should only be downwards relative, not upwards.
2241
        """
2242
        base = self.get_readonly_server().get_url()
2520.3.1 by Vincent Ladeuil
Fix 110448 by adding a relpath parameter to get_transport.
2243
        return self._adjust_url(base, relpath)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2244
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2245
    def get_vfs_only_server(self):
2018.5.44 by Andrew Bennetts
Small changes to help a couple more tests pass.
2246
        """Get the vfs only read/write server instance.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2247
2248
        This is useful for some tests with specific servers that need
2249
        diagnostics.
2250
2251
        For TestCaseWithMemoryTransport this is always a MemoryServer, and there
2252
        is no means to override it.
2253
        """
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2254
        if self.__vfs_server is None:
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
2255
            self.__vfs_server = memory.MemoryServer()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2256
            self.start_server(self.__vfs_server)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2257
        return self.__vfs_server
2258
2259
    def get_server(self):
2260
        """Get the read/write server instance.
2261
2262
        This is useful for some tests with specific servers that need
2263
        diagnostics.
2264
2265
        This is built from the self.transport_server factory. If that is None,
2266
        then the self.get_vfs_server is returned.
2267
        """
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2268
        if self.__server is None:
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2269
            if (self.transport_server is None or self.transport_server is
2270
                self.vfs_transport_factory):
2271
                self.__server = self.get_vfs_only_server()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2272
            else:
2273
                # bring up a decorated means of access to the vfs only server.
2274
                self.__server = self.transport_server()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2275
                self.start_server(self.__server, self.get_vfs_only_server())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2276
        return self.__server
2277
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2278
    def _adjust_url(self, base, relpath):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2279
        """Get a URL (or maybe a path) for the readwrite transport.
2280
2281
        This will either be backed by '.' or to an equivalent non-file based
2282
        facility.
2283
        relpath provides for clients to get a path relative to the base url.
2284
        These should only be downwards relative, not upwards.
2285
        """
2286
        if relpath is not None and relpath != '.':
2287
            if not base.endswith('/'):
2288
                base = base + '/'
2289
            # XXX: Really base should be a url; we did after all call
2290
            # get_url()!  But sometimes it's just a path (from
2291
            # LocalAbspathServer), and it'd be wrong to append urlescaped data
2292
            # to a non-escaped local path.
2293
            if base.startswith('./') or base.startswith('/'):
2294
                base += relpath
2295
            else:
2296
                base += urlutils.escape(relpath)
2297
        return base
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2298
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2299
    def get_url(self, relpath=None):
2300
        """Get a URL (or maybe a path) for the readwrite transport.
2301
2302
        This will either be backed by '.' or to an equivalent non-file based
2303
        facility.
2304
        relpath provides for clients to get a path relative to the base url.
2305
        These should only be downwards relative, not upwards.
2306
        """
2307
        base = self.get_server().get_url()
2308
        return self._adjust_url(base, relpath)
2309
2310
    def get_vfs_only_url(self, relpath=None):
2311
        """Get a URL (or maybe a path for the plain old vfs transport.
2312
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2313
        This will never be a smart protocol.  It always has all the
2314
        capabilities of the local filesystem, but it might actually be a
2315
        MemoryTransport or some other similar virtual filesystem.
2316
2399.1.16 by John Arbash Meinel
[merge] bzr.dev 2466
2317
        This is the backing transport (if any) of the server returned by
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2318
        get_url and get_readonly_url.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2319
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2320
        :param relpath: provides for clients to get a path relative to the base
2321
            url.  These should only be downwards relative, not upwards.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2322
        :return: A URL
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2323
        """
2324
        base = self.get_vfs_only_server().get_url()
2325
        return self._adjust_url(base, relpath)
2326
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2327
    def _create_safety_net(self):
2328
        """Make a fake bzr directory.
2329
2875.1.1 by Vincent Ladeuil
Fix #147986 by monitoring a safety .bzr directory.
2330
        This prevents any tests propagating up onto the TEST_ROOT directory's
2331
        real branch.
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2332
        """
2333
        root = TestCaseWithMemoryTransport.TEST_ROOT
2334
        bzrdir.BzrDir.create_standalone_workingtree(root)
2335
2336
    def _check_safety_net(self):
2337
        """Check that the safety .bzr directory have not been touched.
2338
2339
        _make_test_root have created a .bzr directory to prevent tests from
2340
        propagating. This method ensures than a test did not leaked.
2341
        """
2342
        root = TestCaseWithMemoryTransport.TEST_ROOT
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2343
        self.permit_url(_mod_transport.get_transport(root).base)
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2344
        wt = workingtree.WorkingTree.open(root)
2345
        last_rev = wt.last_revision()
2346
        if last_rev != 'null:':
2347
            # The current test have modified the /bzr directory, we need to
2348
            # recreate a new one or all the followng tests will fail.
2349
            # If you need to inspect its content uncomment the following line
2350
            # import pdb; pdb.set_trace()
4807.3.3 by John Arbash Meinel
Report the test-id when we fail to delete a testing dir.
2351
            _rmtree_temp_dir(root + '/.bzr', test_id=self.id())
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2352
            self._create_safety_net()
2353
            raise AssertionError('%s/.bzr should not be modified' % root)
2354
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2355
    def _make_test_root(self):
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2356
        if TestCaseWithMemoryTransport.TEST_ROOT is None:
4707.1.1 by Vincent Ladeuil
Fix OSX and FreeBSD failures.
2357
            # Watch out for tricky test dir (on OSX /tmp -> /private/tmp)
2358
            root = osutils.realpath(osutils.mkdtemp(prefix='testbzr-',
2359
                                                    suffix='.tmp'))
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2360
            TestCaseWithMemoryTransport.TEST_ROOT = root
2361
2362
            self._create_safety_net()
2363
2364
            # The same directory is used by all tests, and we're not
2365
            # specifically told when all tests are finished.  This will do.
2366
            atexit.register(_rmtree_temp_dir, root)
2367
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2368
        self.permit_dir(TestCaseWithMemoryTransport.TEST_ROOT)
2817.5.1 by Vincent Ladeuil
Catch leaking tests.
2369
        self.addCleanup(self._check_safety_net)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2370
2371
    def makeAndChdirToTestDir(self):
2372
        """Create a temporary directories for this one test.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2373
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2374
        This must set self.test_home_dir and self.test_dir and chdir to
2375
        self.test_dir.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2376
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2377
        For TestCaseWithMemoryTransport we chdir to the TEST_ROOT for this test.
2378
        """
2379
        os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
2380
        self.test_dir = TestCaseWithMemoryTransport.TEST_ROOT
2381
        self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2382
        self.permit_dir(self.test_dir)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2383
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2384
    def make_branch(self, relpath, format=None):
2385
        """Create a branch on the transport at relpath."""
2386
        repo = self.make_repository(relpath, format=format)
2387
        return repo.bzrdir.create_branch()
2388
2389
    def make_bzrdir(self, relpath, format=None):
2390
        try:
2391
            # might be a relative or absolute path
2392
            maybe_a_url = self.get_url(relpath)
2393
            segments = maybe_a_url.rsplit('/', 1)
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2394
            t = _mod_transport.get_transport(maybe_a_url)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2395
            if len(segments) > 1 and segments[-1] not in ('', '.'):
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
2396
                t.ensure_base()
2230.3.22 by Aaron Bentley
Make test suite use format registry default, not BzrDir default
2397
            if format is None:
2398
                format = 'default'
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
2399
            if isinstance(format, basestring):
2400
                format = bzrdir.format_registry.make_bzrdir(format)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2401
            return format.initialize_on_transport(t)
2402
        except errors.UninitializableFormat:
2403
            raise TestSkipped("Format %s is not initializable." % format)
2404
2405
    def make_repository(self, relpath, shared=False, format=None):
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2406
        """Create a repository on our default transport at relpath.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2407
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2408
        Note that relpath must be a relative path, not a full url.
2409
        """
2410
        # FIXME: If you create a remoterepository this returns the underlying
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2411
        # real format, which is incorrect.  Actually we should make sure that
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
2412
        # RemoteBzrDir returns a RemoteRepository.
2413
        # maybe  mbp 20070410
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2414
        made_control = self.make_bzrdir(relpath, format=format)
2415
        return made_control.create_repository(shared=shared)
2416
5215.3.8 by Marius Kruger
move make_smart_server back to TestCaseWithMemoryTransport from TestCaseWithTransport as per review
2417
    def make_smart_server(self, path, backing_server=None):
2418
        if backing_server is None:
2419
            backing_server = self.get_server()
2420
        smart_server = test_server.SmartTCPServer_for_testing()
2421
        self.start_server(smart_server, backing_server)
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2422
        remote_transport = _mod_transport.get_transport(smart_server.get_url()
2423
                                                   ).clone(path)
5215.3.8 by Marius Kruger
move make_smart_server back to TestCaseWithMemoryTransport from TestCaseWithTransport as per review
2424
        return remote_transport
2425
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
2426
    def make_branch_and_memory_tree(self, relpath, format=None):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2427
        """Create a branch on the default transport and a MemoryTree for it."""
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
2428
        b = self.make_branch(relpath, format=format)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2429
        return memorytree.MemoryTree.create_on_branch(b)
2430
4476.3.59 by Andrew Bennetts
Undo changes that aren't needed anymore.
2431
    def make_branch_builder(self, relpath, format=None):
4257.3.8 by Andrew Bennetts
Fix TestCase.make_branch_builder to make a branch in the specified format. Also add an interrepo test scenario for KnitPack1 -> KnitPack6RichRoot, which fails.
2432
        branch = self.make_branch(relpath, format=format)
4476.3.59 by Andrew Bennetts
Undo changes that aren't needed anymore.
2433
        return branchbuilder.BranchBuilder(branch=branch)
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
2434
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2435
    def overrideEnvironmentForTesting(self):
4815.2.2 by Michael Hudson
another approach
2436
        test_home_dir = self.test_home_dir
2437
        if isinstance(test_home_dir, unicode):
2438
            test_home_dir = test_home_dir.encode(sys.getfilesystemencoding())
2439
        os.environ['HOME'] = test_home_dir
2440
        os.environ['BZR_HOME'] = test_home_dir
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2441
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2442
    def setUp(self):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2443
        super(TestCaseWithMemoryTransport, self).setUp()
5247.2.12 by Vincent Ladeuil
Ensure that all transports close their underlying connection.
2444
        # Ensure that ConnectedTransport doesn't leak sockets
2445
        def get_transport_with_cleanup(*args, **kwargs):
5247.2.38 by Vincent Ladeuil
Don't use a test attribute for orig_get_transport.
2446
            t = orig_get_transport(*args, **kwargs)
5247.2.12 by Vincent Ladeuil
Ensure that all transports close their underlying connection.
2447
            if isinstance(t, _mod_transport.ConnectedTransport):
2448
                self.addCleanup(t.disconnect)
2449
            return t
2450
5247.2.38 by Vincent Ladeuil
Don't use a test attribute for orig_get_transport.
2451
        orig_get_transport = self.overrideAttr(_mod_transport, 'get_transport',
2452
                                               get_transport_with_cleanup)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2453
        self._make_test_root()
4985.2.1 by Vincent Ladeuil
Deploy addAttrCleanup on the whole test suite.
2454
        self.addCleanup(os.chdir, os.getcwdu())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2455
        self.makeAndChdirToTestDir()
2456
        self.overrideEnvironmentForTesting()
2457
        self.__readonly_server = None
2458
        self.__server = None
2381.1.3 by Robert Collins
Review feedback.
2459
        self.reduceLockdirTimeout()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2460
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2461
    def setup_smart_server_with_call_log(self):
2462
        """Sets up a smart server as the transport server with a call log."""
5017.3.23 by Vincent Ladeuil
selftest -s bt.test_bzrdir passing
2463
        self.transport_server = test_server.SmartTCPServer_for_testing
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2464
        self.hpss_calls = []
4070.3.1 by Robert Collins
Alter branch sprouting with an alternate fix for stacked branches that does not require multiple copy_content_into and set_parent calls, reducing IO and round trips.
2465
        import traceback
2466
        # Skip the current stack down to the caller of
2467
        # setup_smart_server_with_call_log
2468
        prefix_length = len(traceback.extract_stack()) - 2
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2469
        def capture_hpss_call(params):
4070.3.1 by Robert Collins
Alter branch sprouting with an alternate fix for stacked branches that does not require multiple copy_content_into and set_parent calls, reducing IO and round trips.
2470
            self.hpss_calls.append(
2471
                CapturedCall(params, prefix_length))
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
2472
        client._SmartClient.hooks.install_named_hook(
2473
            'call', capture_hpss_call, None)
2474
2475
    def reset_smart_call_log(self):
2476
        self.hpss_calls = []
2477
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2478
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2479
class TestCaseInTempDir(TestCaseWithMemoryTransport):
2480
    """Derived class that runs a test within a temporary directory.
2481
2482
    This is useful for tests that need to create a branch, etc.
2483
2484
    The directory is created in a slightly complex way: for each
2485
    Python invocation, a new temporary top-level directory is created.
2486
    All test cases create their own directory within that.  If the
2487
    tests complete successfully, the directory is removed.
2488
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2489
    :ivar test_base_dir: The path of the top-level directory for this
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2490
    test, which contains a home directory and a work directory.
2491
2492
    :ivar test_home_dir: An initially empty directory under test_base_dir
2493
    which is used as $HOME for this test.
2494
2495
    :ivar test_dir: A directory under test_base_dir used as the current
2496
    directory when the test proper is run.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2497
    """
2498
2499
    OVERRIDE_PYTHON = 'python'
2500
2501
    def check_file_contents(self, filename, expect):
2502
        self.log("check contents of file %s" % filename)
4708.2.2 by Martin
Workingtree changes sitting around since November, more explict closing of files in bzrlib
2503
        f = file(filename)
2504
        try:
2505
            contents = f.read()
2506
        finally:
2507
            f.close()
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2508
        if contents != expect:
2509
            self.log("expected: %r" % expect)
2510
            self.log("actually: %r" % contents)
2511
            self.fail("contents of %s not as expected" % filename)
2512
3549.2.4 by Martin Pool
Rename _getTestDirPrefix not to look like a test
2513
    def _getTestDirPrefix(self):
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2514
        # create a directory within the top level test directory
4615.3.1 by Martin
Extend work around for path length limitations in selftest to cygwin
2515
        if sys.platform in ('win32', 'cygwin'):
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2516
            name_prefix = re.sub('[<>*=+",:;_/\\-]', '_', self.id())
2517
            # windows is likely to have path-length limits so use a short name
2518
            name_prefix = name_prefix[-30:]
2519
        else:
2520
            name_prefix = re.sub('[/]', '_', self.id())
2521
        return name_prefix
2522
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2523
    def makeAndChdirToTestDir(self):
2524
        """See TestCaseWithMemoryTransport.makeAndChdirToTestDir().
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2525
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2526
        For TestCaseInTempDir we create a temporary directory based on the test
2527
        name and then create two subdirs - test and home under it.
2528
        """
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
2529
        name_prefix = osutils.pathjoin(TestCaseWithMemoryTransport.TEST_ROOT,
2530
            self._getTestDirPrefix())
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2531
        name = name_prefix
2532
        for i in range(100):
2533
            if os.path.exists(name):
2534
                name = name_prefix + '_' + str(i)
2535
            else:
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2536
                # now create test and home directories within this dir
2537
                self.test_base_dir = name
2538
                self.addCleanup(self.deleteTestDir)
2539
                os.mkdir(self.test_base_dir)
3549.2.1 by Martin Pool
Use test names in the temporary directory name
2540
                break
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2541
        self.permit_dir(self.test_base_dir)
2542
        # 'sprouting' and 'init' of a branch both walk up the tree to find
2543
        # stacking policy to honour; create a bzr dir with an unshared
2544
        # repository (but not a branch - our code would be trying to escape
2545
        # then!) to stop them, and permit it to be read.
2546
        # control = bzrdir.BzrDir.create(self.test_base_dir)
2547
        # control.create_repository()
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2548
        self.test_home_dir = self.test_base_dir + '/home'
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2549
        os.mkdir(self.test_home_dir)
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2550
        self.test_dir = self.test_base_dir + '/work'
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2551
        os.mkdir(self.test_dir)
2552
        os.chdir(self.test_dir)
2553
        # put name of test inside
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2554
        f = file(self.test_base_dir + '/name', 'w')
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2555
        try:
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2556
            f.write(self.id())
2485.6.1 by Martin Pool
Remove duplication in TestCaseInTempDir.makeAndChdirToTestDir
2557
        finally:
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2558
            f.close()
2485.6.3 by Martin Pool
TestCaseInTempDir takes responsibility for cleaning up its own test dir
2559
2560
    def deleteTestDir(self):
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
2561
        os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
4807.3.3 by John Arbash Meinel
Report the test-id when we fail to delete a testing dir.
2562
        _rmtree_temp_dir(self.test_base_dir, test_id=self.id())
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2563
2193.2.1 by Alexander Belchenko
selftest: build tree for test with binary line-endings by default
2564
    def build_tree(self, shape, line_endings='binary', transport=None):
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2565
        """Build a test tree according to a pattern.
2566
2567
        shape is a sequence of file specifications.  If the final
2568
        character is '/', a directory is created.
2569
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
2570
        This assumes that all the elements in the tree being built are new.
2571
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2572
        This doesn't add anything to a branch.
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2573
3034.4.8 by Alexander Belchenko
TestCaseInTempDir.build_tree now checks type of shape argument.
2574
        :type shape:    list or tuple.
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
2575
        :param line_endings: Either 'binary' or 'native'
2399.1.6 by John Arbash Meinel
Cleanup bzrlib/tests/__init__.py so that epydoc doesn't complain.
2576
            in binary mode, exact contents are written in native mode, the
2577
            line endings match the default platform endings.
2578
        :param transport: A transport to write to, for building trees on VFS's.
2579
            If the transport is readonly or None, "." is opened automatically.
2580
        :return: None
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2581
        """
3044.1.1 by Martin Pool
Fix up calls to TestCase.build_tree passing a string rather than a list
2582
        if type(shape) not in (list, tuple):
2583
            raise AssertionError("Parameter 'shape' should be "
2584
                "a list or a tuple. Got %r instead" % (shape,))
1755.3.1 by Robert Collins
Tune the time to build our kernel_like tree : make LocalTransport.put faster, AtomicFile faster, LocalTransport.append faster.
2585
        # It's OK to just create them using forward slashes on windows.
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2586
        if transport is None or transport.is_readonly():
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
2587
            transport = _mod_transport.get_transport(".")
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2588
        for name in shape:
3757.3.2 by Vincent Ladeuil
Add a credential store for '.netrc'.
2589
            self.assertIsInstance(name, basestring)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2590
            if name[-1] == '/':
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2591
                transport.mkdir(urlutils.escape(name[:-1]))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2592
            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
2593
                if line_endings == 'binary':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2594
                    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
2595
                elif line_endings == 'native':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
2596
                    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
2597
                else:
2227.2.2 by v.ladeuil+lp at free
Cleanup.
2598
                    raise errors.BzrError(
2599
                        '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
2600
                content = "contents of %s%s" % (name.encode('utf-8'), end)
1955.3.27 by John Arbash Meinel
rename non_atomic_put_* to put_*non_atomic, and re-order the functions
2601
                transport.put_bytes_non_atomic(urlutils.escape(name), content)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2602
5200.2.4 by Robert Collins
Review feedback.
2603
    build_tree_contents = staticmethod(treeshape.build_tree_contents)
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
2604
2655.2.5 by Marius Kruger
* Improve BzrRemoveChangedFilesError message.
2605
    def assertInWorkingTree(self, path, root_path='.', tree=None):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2606
        """Assert whether path or paths are in the WorkingTree"""
2607
        if tree is None:
2608
            tree = workingtree.WorkingTree.open(root_path)
2609
        if not isinstance(path, basestring):
2610
            for p in path:
3585.2.1 by Robert Collins
Create acceptance test for bug 150438.
2611
                self.assertInWorkingTree(p, tree=tree)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2612
        else:
2613
            self.assertIsNot(tree.path2id(path), None,
2614
                path+' not in working tree.')
2615
2655.2.5 by Marius Kruger
* Improve BzrRemoveChangedFilesError message.
2616
    def assertNotInWorkingTree(self, path, root_path='.', tree=None):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
2617
        """Assert whether path or paths are not in the WorkingTree"""
2618
        if tree is None:
2619
            tree = workingtree.WorkingTree.open(root_path)
2620
        if not isinstance(path, basestring):
2621
            for p in path:
2622
                self.assertNotInWorkingTree(p,tree=tree)
2623
        else:
2624
            self.assertIs(tree.path2id(path), None, path+' in working tree.')
2227.2.1 by v.ladeuil+lp at free
Small fixes to test suite in the hope that it will facilitate the
2625
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
2626
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2627
class TestCaseWithTransport(TestCaseInTempDir):
2628
    """A test case that provides get_url and get_readonly_url facilities.
2629
2630
    These back onto two transport servers, one for readonly access and one for
2631
    read write access.
2632
2633
    If no explicit class is provided for readonly access, a
2634
    ReadonlyTransportDecorator is used instead which allows the use of non disk
2635
    based read write transports.
2636
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2637
    If an explicit class is provided for readonly access, that server and the
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2638
    readwrite one must both define get_url() as resolving to os.getcwd().
2639
    """
2640
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2641
    def get_vfs_only_server(self):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2642
        """See TestCaseWithMemoryTransport.
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
2643
2644
        This is useful for some tests with specific servers that need
2645
        diagnostics.
2646
        """
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2647
        if self.__vfs_server is None:
2648
            self.__vfs_server = self.vfs_transport_factory()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
2649
            self.start_server(self.__vfs_server)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2650
        return self.__vfs_server
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2651
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2652
    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.
2653
        """Create a branch on the transport and a tree locally.
2654
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
2655
        If the transport is not a LocalTransport, the Tree can't be created on
2381.1.2 by Robert Collins
Fixup the test changes made for hpss to be clean and self contained.
2656
        the transport.  In that case if the vfs_transport_factory is
2657
        LocalURLServer the working tree is created in the local
2018.5.88 by Andrew Bennetts
Clarify make_branch_and_tree docstring a little.
2658
        directory backing the transport, and the returned tree's branch and
2381.1.2 by Robert Collins
Fixup the test changes made for hpss to be clean and self contained.
2659
        repository will also be accessed locally. Otherwise a lightweight
2660
        checkout is created and returned.
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
2661
4650.1.2 by Robert Collins
Remove unnecessary use of an SFTP server connection to test the behaviour of TestCase.make_branch_and_tree.
2662
        We do this because we can't physically create a tree in the local
2663
        path, with a branch reference to the transport_factory url, and
2664
        a branch + repository in the vfs_transport, unless the vfs_transport
2665
        namespace is distinct from the local disk - the two branch objects
2666
        would collide. While we could construct a tree with its branch object
2667
        pointing at the transport_factory transport in memory, reopening it
2668
        would behaving unexpectedly, and has in the past caused testing bugs
2669
        when we tried to do it that way.
2670
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
2671
        :param format: The BzrDirFormat.
2672
        :returns: the WorkingTree.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2673
        """
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.
2674
        # TODO: always use the local disk path for the working tree,
2675
        # this obviously requires a format that supports branch references
2676
        # so check for that by checking bzrdir.BzrDirFormat.get_default_format()
2677
        # RBC 20060208
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2678
        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.
2679
        try:
2680
            return b.bzrdir.create_workingtree()
2681
        except errors.NotLocalUrl:
1910.14.1 by Andrew Bennetts
Fix to make_branch_and_tree's behavior when used with an sftp transport.
2682
            # We can only make working trees locally at the moment.  If the
2018.5.87 by Andrew Bennetts
Make make_branch_and_tree fall back to creating a local checkout if the transport doesn't support working trees, allowing several more Remote tests to pass.
2683
            # transport can't support them, then we keep the non-disk-backed
2684
            # branch and create a local checkout.
5017.3.6 by Vincent Ladeuil
Fix some fallouts of moving test servers around.
2685
            if self.vfs_transport_factory is test_server.LocalURLServer:
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
2686
                # the branch is colocated on disk, we cannot create a checkout.
2687
                # hopefully callers will expect this.
2688
                local_controldir= bzrdir.BzrDir.open(self.get_vfs_only_url(relpath))
3489.2.1 by Andrew Bennetts
Fix make_branch_and_tree to return a tree whose .branch is always the right format.
2689
                wt = local_controldir.create_workingtree()
3489.2.5 by Andrew Bennetts
Tweak suggested by John's review.
2690
                if wt.branch._format != b._format:
3489.2.1 by Andrew Bennetts
Fix make_branch_and_tree to return a tree whose .branch is always the right format.
2691
                    wt._branch = b
2692
                    # Make sure that assigning to wt._branch fixes wt.branch,
2693
                    # in case the implementation details of workingtree objects
2694
                    # change.
2695
                    self.assertIs(b, wt.branch)
2696
                return wt
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
2697
            else:
2698
                return b.create_checkout(relpath, lightweight=True)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
2699
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
2700
    def assertIsDirectory(self, relpath, transport):
2701
        """Assert that relpath within transport is a directory.
2702
2703
        This may not be possible on all transports; in that case it propagates
2704
        a TransportNotPossible.
2705
        """
2706
        try:
2707
            mode = transport.stat(relpath).st_mode
2708
        except errors.NoSuchFile:
2709
            self.fail("path %s is not a directory; no such file"
2710
                      % (relpath))
2711
        if not stat.S_ISDIR(mode):
2712
            self.fail("path %s is not a directory; has mode %#o"
2713
                      % (relpath, mode))
2714
1852.13.18 by Robert Collins
Write top level acceptance test for dirstate.
2715
    def assertTreesEqual(self, left, right):
2716
        """Check that left and right have the same content and properties."""
2717
        # we use a tree delta to check for equality of the content, and we
2718
        # manually check for equality of other things such as the parents list.
2719
        self.assertEqual(left.get_parent_ids(), right.get_parent_ids())
2720
        differences = left.changes_from(right)
2255.2.3 by Robert Collins
Split out working tree format 4 to its own file, create stub dirstate revision object, start working on dirstate.set_parent_trees - a key failure point.
2721
        self.assertFalse(differences.has_changed(),
2722
            "Trees %r and %r are different: %r" % (left, right, differences))
1852.13.18 by Robert Collins
Write top level acceptance test for dirstate.
2723
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2724
    def setUp(self):
2725
        super(TestCaseWithTransport, self).setUp()
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2726
        self.__vfs_server = None
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
2727
4695.3.2 by Vincent Ladeuil
Simplified and claried as per Robert's review.
2728
    def disable_missing_extensions_warning(self):
2729
        """Some tests expect a precise stderr content.
2730
2731
        There is no point in forcing them to duplicate the extension related
2732
        warning.
2733
        """
2734
        config.GlobalConfig().set_user_option('ignore_missing_extensions', True)
2735
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
2736
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2737
class ChrootedTestCase(TestCaseWithTransport):
2738
    """A support class that provides readonly urls outside the local namespace.
2739
2740
    This is done by checking if self.transport_server is a MemoryServer. if it
2741
    is then we are chrooted already, if it is not then an HttpServer is used
2742
    for readonly urls.
2743
2744
    TODO RBC 20060127: make this an option to TestCaseWithTransport so it can
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2745
                       be used without needed to redo it when a different
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2746
                       subclass is in use ?
2747
    """
2748
2749
    def setUp(self):
4731.2.9 by Vincent Ladeuil
Implement a new -Ethreads to better track the leaks.
2750
        from bzrlib.tests import http_server
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2751
        super(ChrootedTestCase, self).setUp()
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
2752
        if not self.vfs_transport_factory == memory.MemoryServer:
4731.2.9 by Vincent Ladeuil
Implement a new -Ethreads to better track the leaks.
2753
            self.transport_readonly_server = http_server.HttpServer
1534.4.31 by Robert Collins
cleanedup test_outside_wt
2754
2755
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2756
def condition_id_re(pattern):
2757
    """Create a condition filter which performs a re check on a test's id.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2758
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2759
    :param pattern: A regular expression string.
2760
    :return: A callable that returns True if the re matches.
2761
    """
5326.2.1 by Parth Malwankar
added InvalidPattern error.
2762
    filter_re = re.compile(pattern, 0)
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2763
    def condition(test):
2764
        test_id = test.id()
2765
        return filter_re.search(test_id)
2766
    return condition
2767
2768
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
2769
def condition_isinstance(klass_or_klass_list):
2770
    """Create a condition filter which returns isinstance(param, klass).
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2771
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
2772
    :return: A callable which when called with one parameter obj return the
2773
        result of isinstance(obj, klass_or_klass_list).
2774
    """
2775
    def condition(obj):
2776
        return isinstance(obj, klass_or_klass_list)
2777
    return condition
2778
2779
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2780
def condition_id_in_list(id_list):
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2781
    """Create a condition filter which verify that test's id in a list.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2782
3302.8.4 by Vincent Ladeuil
Cosmetic changes.
2783
    :param id_list: A TestIdList object.
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2784
    :return: A callable that returns True if the test's id appears in the list.
2785
    """
2786
    def condition(test):
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
2787
        return id_list.includes(test.id())
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2788
    return condition
2789
2790
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2791
def condition_id_startswith(starts):
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2792
    """Create a condition filter verifying that test's id starts with a string.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2793
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2794
    :param starts: A list of string.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2795
    :return: A callable that returns True if the test's id starts with one of
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2796
        the given strings.
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2797
    """
2798
    def condition(test):
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2799
        for start in starts:
2800
            if test.id().startswith(start):
2801
                return True
2802
        return False
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2803
    return condition
2804
2805
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2806
def exclude_tests_by_condition(suite, condition):
2807
    """Create a test suite which excludes some tests from suite.
2808
2809
    :param suite: The suite to get tests from.
2810
    :param condition: A callable whose result evaluates True when called with a
2811
        test case which should be excluded from the result.
2812
    :return: A suite which contains the tests found in suite that fail
2813
        condition.
2814
    """
2815
    result = []
2816
    for test in iter_suite_tests(suite):
2817
        if not condition(test):
2818
            result.append(test)
2819
    return TestUtil.TestSuite(result)
2820
2821
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2822
def filter_suite_by_condition(suite, condition):
2823
    """Create a test suite by filtering another one.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2824
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2825
    :param suite: The source suite.
2826
    :param condition: A callable whose result evaluates True when called with a
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2827
        test case which should be included in the result.
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2828
    :return: A suite which contains the tests found in suite that pass
2829
        condition.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2830
    """
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2831
    result = []
2832
    for test in iter_suite_tests(suite):
2833
        if condition(test):
2834
            result.append(test)
2835
    return TestUtil.TestSuite(result)
2836
2837
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
2838
def filter_suite_by_re(suite, pattern):
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
2839
    """Create a test suite by filtering another one.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2840
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
2841
    :param suite:           the source suite
2842
    :param pattern:         pattern that names must match
2843
    :returns: the newly created suite
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2844
    """
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2845
    condition = condition_id_re(pattern)
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2846
    result_suite = filter_suite_by_condition(suite, condition)
2921.6.4 by Robert Collins
Move the filter implementation of sort_tests_by_re back to filter_tests_by_re.
2847
    return result_suite
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
2848
2849
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2850
def filter_suite_by_id_list(suite, test_id_list):
2851
    """Create a test suite by filtering another one.
2852
2853
    :param suite: The source suite.
2854
    :param test_id_list: A list of the test ids to keep as strings.
2855
    :returns: the newly created suite
2856
    """
2857
    condition = condition_id_in_list(test_id_list)
2858
    result_suite = filter_suite_by_condition(suite, condition)
2859
    return result_suite
2860
2861
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2862
def filter_suite_by_id_startswith(suite, start):
2863
    """Create a test suite by filtering another one.
2864
2865
    :param suite: The source suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2866
    :param start: A list of string the test id must start with one of.
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2867
    :returns: the newly created suite
2868
    """
2869
    condition = condition_id_startswith(start)
2870
    result_suite = filter_suite_by_condition(suite, condition)
2871
    return result_suite
2872
2873
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
2874
def exclude_tests_by_re(suite, pattern):
2875
    """Create a test suite which excludes some tests from suite.
2876
2877
    :param suite: The suite to get tests from.
2878
    :param pattern: A regular expression string. Test ids that match this
2879
        pattern will be excluded from the result.
2880
    :return: A TestSuite that contains all the tests from suite without the
2881
        tests that matched pattern. The order of tests is the same as it was in
2882
        suite.
2883
    """
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2884
    return exclude_tests_by_condition(suite, condition_id_re(pattern))
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
2885
2886
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2887
def preserve_input(something):
2888
    """A helper for performing test suite transformation chains.
2889
2890
    :param something: Anything you want to preserve.
2891
    :return: Something.
2892
    """
2893
    return something
2894
2895
3128.1.2 by Vincent Ladeuil
Tweak as per review feedback: s/randomise.*/randomize&/, 0.92 -> 1.0.
2896
def randomize_suite(suite):
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2897
    """Return a new TestSuite with suite's tests in random order.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2898
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2899
    The tests in the input suite are flattened into a single suite in order to
2900
    accomplish this. Any nested TestSuites are removed to provide global
2901
    randomness.
2902
    """
2921.6.3 by Robert Collins
* New helper method ``bzrlib.tests.randomise_suite`` which returns a
2903
    tests = list(iter_suite_tests(suite))
2904
    random.shuffle(tests)
2905
    return TestUtil.TestSuite(tests)
2906
2907
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2908
def split_suite_by_condition(suite, condition):
2909
    """Split a test suite into two by a condition.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2910
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2911
    :param suite: The suite to split.
2912
    :param condition: The condition to match on. Tests that match this
2913
        condition are returned in the first test suite, ones that do not match
2914
        are in the second suite.
2915
    :return: A tuple of two test suites, where the first contains tests from
2916
        suite matching the condition, and the second contains the remainder
2917
        from suite. The order within each output suite is the same as it was in
2918
        suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2919
    """
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2920
    matched = []
2921
    did_not_match = []
2922
    for test in iter_suite_tests(suite):
2923
        if condition(test):
2924
            matched.append(test)
2925
        else:
2926
            did_not_match.append(test)
2927
    return TestUtil.TestSuite(matched), TestUtil.TestSuite(did_not_match)
2928
2929
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2930
def split_suite_by_re(suite, pattern):
2931
    """Split a test suite into two by a regular expression.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2932
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2933
    :param suite: The suite to split.
2934
    :param pattern: A regular expression string. Test ids that match this
2935
        pattern will be in the first test suite returned, and the others in the
2936
        second test suite returned.
2937
    :return: A tuple of two test suites, where the first contains tests from
2938
        suite matching pattern, and the second contains the remainder from
2939
        suite. The order within each output suite is the same as it was in
2940
        suite.
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2941
    """
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2942
    return split_suite_by_condition(suite, condition_id_re(pattern))
2213.2.1 by Martin Pool
Add selftest --first flag
2943
2944
1185.16.58 by mbp at sourcefrog
- run all selftests by default
2945
def run_suite(suite, name='test', verbose=False, pattern=".*",
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
2946
              stop_on_failure=False,
2213.2.1 by Martin Pool
Add selftest --first flag
2947
              transport=None, lsprof_timed=None, bench_history=None,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
2948
              matching_tests_first=None,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
2949
              list_only=False,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
2950
              random_seed=None,
2418.4.1 by John Arbash Meinel
(Ian Clatworthy) Bugs #102679, #102686. Add --exclude and --randomize to 'bzr selftest'
2951
              exclude_pattern=None,
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
2952
              strict=False,
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
2953
              runner_class=None,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
2954
              suite_decorators=None,
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
2955
              stream=None,
2956
              result_decorators=None,
2957
              ):
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
2958
    """Run a test suite for bzr selftest.
2959
2960
    :param runner_class: The class of runner to use. Must support the
2961
        constructor arguments passed by run_suite which are more than standard
2962
        python uses.
2963
    :return: A boolean indicating success.
2964
    """
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2965
    TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
2966
    if verbose:
2967
        verbosity = 2
2968
    else:
2969
        verbosity = 1
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
2970
    if runner_class is None:
2971
        runner_class = TextTestRunner
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
2972
    if stream is None:
2973
        stream = sys.stdout
2974
    runner = runner_class(stream=stream,
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
2975
                            descriptions=0,
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
2976
                            verbosity=verbosity,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2977
                            bench_history=bench_history,
4271.2.1 by Robert Collins
Move test prelude and suffix output to ExtendedTestResult
2978
                            strict=strict,
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
2979
                            result_decorators=result_decorators,
2379.6.3 by Alexander Belchenko
Rework NUMBERED_DIRS usage to keep test_selftest.py passing the tests on win32
2980
                            )
1185.16.58 by mbp at sourcefrog
- run all selftests by default
2981
    runner.stop_on_failure=stop_on_failure
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
2982
    # built in decorator factories:
2983
    decorators = [
2984
        random_order(random_seed, runner),
2985
        exclude_tests(exclude_pattern),
2986
        ]
2987
    if matching_tests_first:
2988
        decorators.append(tests_first(pattern))
2989
    else:
2990
        decorators.append(filter_tests(pattern))
2991
    if suite_decorators:
2992
        decorators.extend(suite_decorators)
4618.1.1 by Vincent Ladeuil
Make --parallel=fork work again.
2993
    # tell the result object how many tests will be running: (except if
4618.1.2 by Vincent Ladeuil
Fixed as per John's review.
2994
    # --parallel=fork is being used. Robert said he will provide a better
4618.1.1 by Vincent Ladeuil
Make --parallel=fork work again.
2995
    # progress design later -- vila 20090817)
4618.1.2 by Vincent Ladeuil
Fixed as per John's review.
2996
    if fork_decorator not in decorators:
4618.1.1 by Vincent Ladeuil
Make --parallel=fork work again.
2997
        decorators.append(CountingDecorator)
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
2998
    for decorator in decorators:
2999
        suite = decorator(suite)
4266.2.1 by Robert Collins
Remove noise from bzr selftest --list-only so that it is easier to use in scripts.
3000
    if list_only:
4650.1.9 by Robert Collins
Detangle test listing: its more part of the ui layer not the execute-this-test-layer.
3001
        # Done after test suite decoration to allow randomisation etc
3002
        # to take effect, though that is of marginal benefit.
3003
        if verbosity >= 2:
3004
            stream.write("Listing tests only ...\n")
3005
        for t in iter_suite_tests(suite):
3006
            stream.write("%s\n" % (t.id()))
4266.2.1 by Robert Collins
Remove noise from bzr selftest --list-only so that it is easier to use in scripts.
3007
        return True
4650.1.9 by Robert Collins
Detangle test listing: its more part of the ui layer not the execute-this-test-layer.
3008
    result = runner.run(suite)
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3009
    if strict:
3010
        return result.wasStrictlySuccessful()
3011
    else:
3012
        return result.wasSuccessful()
3013
3014
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3015
# A registry where get() returns a suite decorator.
3016
parallel_registry = registry.Registry()
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3017
3018
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3019
def fork_decorator(suite):
5393.5.2 by Martin
Move check 'closer to the metal' as requested by lifelss in review
3020
    if getattr(os, "fork", None) is None:
3021
        raise errors.BzrCommandError("platform does not support fork,"
3022
            " try --parallel=subprocess instead.")
4398.4.3 by Vincent Ladeuil
Detect # cores on win32 and Solaris too.
3023
    concurrency = osutils.local_concurrency()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3024
    if concurrency == 1:
3025
        return suite
3026
    from testtools import ConcurrentTestSuite
3027
    return ConcurrentTestSuite(suite, fork_for_tests)
3028
parallel_registry.register('fork', fork_decorator)
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3029
3030
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3031
def subprocess_decorator(suite):
4398.4.3 by Vincent Ladeuil
Detect # cores on win32 and Solaris too.
3032
    concurrency = osutils.local_concurrency()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3033
    if concurrency == 1:
3034
        return suite
3035
    from testtools import ConcurrentTestSuite
3036
    return ConcurrentTestSuite(suite, reinvoke_for_tests)
3037
parallel_registry.register('subprocess', subprocess_decorator)
3038
3039
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3040
def exclude_tests(exclude_pattern):
3041
    """Return a test suite decorator that excludes tests."""
3042
    if exclude_pattern is None:
3043
        return identity_decorator
3044
    def decorator(suite):
3045
        return ExcludeDecorator(suite, exclude_pattern)
3046
    return decorator
3047
3048
3049
def filter_tests(pattern):
3050
    if pattern == '.*':
3051
        return identity_decorator
3052
    def decorator(suite):
3053
        return FilterTestsDecorator(suite, pattern)
3054
    return decorator
3055
3056
3057
def random_order(random_seed, runner):
3058
    """Return a test suite decorator factory for randomising tests order.
3059
    
3060
    :param random_seed: now, a string which casts to a long, or a long.
3061
    :param runner: A test runner with a stream attribute to report on.
3062
    """
3063
    if random_seed is None:
3064
        return identity_decorator
3065
    def decorator(suite):
3066
        return RandomDecorator(suite, random_seed, runner.stream)
3067
    return decorator
3068
3069
3070
def tests_first(pattern):
3071
    if pattern == '.*':
3072
        return identity_decorator
3073
    def decorator(suite):
3074
        return TestFirstDecorator(suite, pattern)
3075
    return decorator
3076
3077
3078
def identity_decorator(suite):
3079
    """Return suite."""
3080
    return suite
3081
3082
5247.1.1 by Vincent Ladeuil
Merge previous attempt into current trunk
3083
class TestDecorator(TestUtil.TestSuite):
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3084
    """A decorator for TestCase/TestSuite objects.
3085
    
3086
    Usually, subclasses should override __iter__(used when flattening test
3087
    suites), which we do to filter, reorder, parallelise and so on, run() and
3088
    debug().
3089
    """
3090
3091
    def __init__(self, suite):
5247.1.1 by Vincent Ladeuil
Merge previous attempt into current trunk
3092
        TestUtil.TestSuite.__init__(self)
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3093
        self.addTest(suite)
3094
3095
    def countTestCases(self):
3096
        cases = 0
3097
        for test in self:
3098
            cases += test.countTestCases()
3099
        return cases
3100
3101
    def debug(self):
3102
        for test in self:
3103
            test.debug()
3104
3105
    def run(self, result):
3106
        # Use iteration on self, not self._tests, to allow subclasses to hook
3107
        # into __iter__.
3108
        for test in self:
3109
            if result.shouldStop:
3110
                break
3111
            test.run(result)
3112
        return result
3113
3114
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
3115
class CountingDecorator(TestDecorator):
3116
    """A decorator which calls result.progress(self.countTestCases)."""
3117
3118
    def run(self, result):
3119
        progress_method = getattr(result, 'progress', None)
3120
        if callable(progress_method):
4573.2.3 by Robert Collins
Support python 2.4.
3121
            progress_method(self.countTestCases(), SUBUNIT_SEEK_SET)
4573.2.1 by Robert Collins
Don't call countTestCases from TextTestRunner.run, rather let tests decide if they want to be counted.
3122
        return super(CountingDecorator, self).run(result)
3123
3124
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3125
class ExcludeDecorator(TestDecorator):
3126
    """A decorator which excludes test matching an exclude pattern."""
3127
3128
    def __init__(self, suite, exclude_pattern):
3129
        TestDecorator.__init__(self, suite)
3130
        self.exclude_pattern = exclude_pattern
3131
        self.excluded = False
3132
3133
    def __iter__(self):
3134
        if self.excluded:
3135
            return iter(self._tests)
3136
        self.excluded = True
3137
        suite = exclude_tests_by_re(self, self.exclude_pattern)
3138
        del self._tests[:]
3139
        self.addTests(suite)
3140
        return iter(self._tests)
3141
3142
3143
class FilterTestsDecorator(TestDecorator):
3144
    """A decorator which filters tests to those matching a pattern."""
3145
3146
    def __init__(self, suite, pattern):
3147
        TestDecorator.__init__(self, suite)
3148
        self.pattern = pattern
3149
        self.filtered = False
3150
3151
    def __iter__(self):
3152
        if self.filtered:
3153
            return iter(self._tests)
3154
        self.filtered = True
3155
        suite = filter_suite_by_re(self, self.pattern)
3156
        del self._tests[:]
3157
        self.addTests(suite)
3158
        return iter(self._tests)
3159
3160
3161
class RandomDecorator(TestDecorator):
3162
    """A decorator which randomises the order of its tests."""
3163
3164
    def __init__(self, suite, random_seed, stream):
3165
        TestDecorator.__init__(self, suite)
3166
        self.random_seed = random_seed
3167
        self.randomised = False
3168
        self.stream = stream
3169
3170
    def __iter__(self):
3171
        if self.randomised:
3172
            return iter(self._tests)
3173
        self.randomised = True
4794.1.9 by Robert Collins
Double \n was deliberate for RandomDecorator.
3174
        self.stream.write("Randomizing test order using seed %s\n\n" %
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3175
            (self.actual_seed()))
3176
        # Initialise the random number generator.
3177
        random.seed(self.actual_seed())
3178
        suite = randomize_suite(self)
3179
        del self._tests[:]
3180
        self.addTests(suite)
3181
        return iter(self._tests)
3182
3183
    def actual_seed(self):
3184
        if self.random_seed == "now":
3185
            # We convert the seed to a long to make it reuseable across
3186
            # invocations (because the user can reenter it).
3187
            self.random_seed = long(time.time())
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3188
        else:
3189
            # Convert the seed to a long if we can
3190
            try:
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3191
                self.random_seed = long(self.random_seed)
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3192
            except:
3193
                pass
4205.3.1 by Robert Collins
Refactor tests.run_suite to be more data driven, making it shorter and able to be extended more easily.
3194
        return self.random_seed
3195
3196
3197
class TestFirstDecorator(TestDecorator):
3198
    """A decorator which moves named tests to the front."""
3199
3200
    def __init__(self, suite, pattern):
3201
        TestDecorator.__init__(self, suite)
3202
        self.pattern = pattern
3203
        self.filtered = False
3204
3205
    def __iter__(self):
3206
        if self.filtered:
3207
            return iter(self._tests)
3208
        self.filtered = True
3209
        suites = split_suite_by_re(self, self.pattern)
3210
        del self._tests[:]
3211
        self.addTests(suites)
3212
        return iter(self._tests)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
3213
3214
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3215
def partition_tests(suite, count):
3216
    """Partition suite into count lists of tests."""
5365.3.1 by Andrew Bennetts
Better (and simpler) algorithm for partition_tests.
3217
    # This just assigns tests in a round-robin fashion.  On one hand this
3218
    # splits up blocks of related tests that might run faster if they shared
3219
    # resources, but on the other it avoids assigning blocks of slow tests to
3220
    # just one partition.  So the slowest partition shouldn't be much slower
3221
    # than the fastest.
3222
    partitions = [list() for i in range(count)]
3223
    tests = iter_suite_tests(suite)
3224
    for partition, test in itertools.izip(itertools.cycle(partitions), tests):
3225
        partition.append(test)
3226
    return partitions
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3227
3228
5180.2.1 by Vincent Ladeuil
Workaround ``Crypto.Random`` check leading to spurious test failures
3229
def workaround_zealous_crypto_random():
3230
    """Crypto.Random want to help us being secure, but we don't care here.
3231
3232
    This workaround some test failure related to the sftp server. Once paramiko
3233
    stop using the controversial API in Crypto.Random, we may get rid of it.
3234
    """
3235
    try:
3236
        from Crypto.Random import atfork
3237
        atfork()
3238
    except ImportError:
3239
        pass
3240
3241
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3242
def fork_for_tests(suite):
3243
    """Take suite and start up one runner per CPU by forking()
3244
3245
    :return: An iterable of TestCase-like objects which can each have
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3246
        run(result) called on them to feed tests to result.
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3247
    """
4398.4.3 by Vincent Ladeuil
Detect # cores on win32 and Solaris too.
3248
    concurrency = osutils.local_concurrency()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3249
    result = []
3250
    from subunit import TestProtocolClient, ProtocolTestCase
4794.1.20 by Robert Collins
Appropriately guard the import of AutoTimingTestResultDecorator from subunit.
3251
    from subunit.test_results import AutoTimingTestResultDecorator
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3252
    class TestInOtherProcess(ProtocolTestCase):
3253
        # Should be in subunit, I think. RBC.
3254
        def __init__(self, stream, pid):
3255
            ProtocolTestCase.__init__(self, stream)
3256
            self.pid = pid
3257
3258
        def run(self, result):
3259
            try:
3260
                ProtocolTestCase.run(self, result)
3261
            finally:
5162.1.1 by Vincent Ladeuil
Babune hangs when zombies are around.
3262
                os.waitpid(self.pid, 0)
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3263
3264
    test_blocks = partition_tests(suite, concurrency)
3265
    for process_tests in test_blocks:
5247.1.1 by Vincent Ladeuil
Merge previous attempt into current trunk
3266
        process_suite = TestUtil.TestSuite()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3267
        process_suite.addTests(process_tests)
3268
        c2pread, c2pwrite = os.pipe()
3269
        pid = os.fork()
3270
        if pid == 0:
5180.2.1 by Vincent Ladeuil
Workaround ``Crypto.Random`` check leading to spurious test failures
3271
            workaround_zealous_crypto_random()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3272
            try:
3273
                os.close(c2pread)
3274
                # Leave stderr and stdout open so we can see test noise
3275
                # Close stdin so that the child goes away if it decides to
3276
                # read from stdin (otherwise its a roulette to see what
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3277
                # child actually gets keystrokes for pdb etc).
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3278
                sys.stdin.close()
3279
                sys.stdin = None
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3280
                stream = os.fdopen(c2pwrite, 'wb', 1)
4794.1.11 by Robert Collins
Remove decorator class that won't be needed with upgraded dependencies.
3281
                subunit_result = AutoTimingTestResultDecorator(
4557.2.1 by Robert Collins
Support timestamping subunit streams.
3282
                    TestProtocolClient(stream))
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3283
                process_suite.run(subunit_result)
3284
            finally:
3285
                os._exit(0)
3286
        else:
3287
            os.close(c2pwrite)
3288
            stream = os.fdopen(c2pread, 'rb', 1)
3289
            test = TestInOtherProcess(stream, pid)
3290
            result.append(test)
3291
    return result
3292
3293
3294
def reinvoke_for_tests(suite):
3295
    """Take suite and start up one runner per CPU using subprocess().
3296
3297
    :return: An iterable of TestCase-like objects which can each have
4229.3.1 by Vincent Ladeuil
Fix selftest --parallel for ConcurrentTestSuite uses.
3298
        run(result) called on them to feed tests to result.
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3299
    """
4398.4.3 by Vincent Ladeuil
Detect # cores on win32 and Solaris too.
3300
    concurrency = osutils.local_concurrency()
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3301
    result = []
4496.3.6 by Andrew Bennetts
Tidy some more imports.
3302
    from subunit import ProtocolTestCase
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3303
    class TestInSubprocess(ProtocolTestCase):
3304
        def __init__(self, process, name):
3305
            ProtocolTestCase.__init__(self, process.stdout)
3306
            self.process = process
3307
            self.process.stdin.close()
3308
            self.name = name
3309
3310
        def run(self, result):
3311
            try:
3312
                ProtocolTestCase.run(self, result)
3313
            finally:
3314
                self.process.wait()
3315
                os.unlink(self.name)
3316
            # print "pid %d finished" % finished_process
3317
    test_blocks = partition_tests(suite, concurrency)
3318
    for process_tests in test_blocks:
3319
        # ugly; currently reimplement rather than reuses TestCase methods.
3320
        bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
3321
        if not os.path.isfile(bzr_path):
3322
            # We are probably installed. Assume sys.argv is the right file
3323
            bzr_path = sys.argv[0]
4805.2.1 by Gordon Tyler
Fixed reinvoke_for_tests to work on win32.
3324
        bzr_path = [bzr_path]
3325
        if sys.platform == "win32":
3326
            # if we're on windows, we can't execute the bzr script directly
5163.1.3 by Gordon Tyler
Set stdout to binary mode on win32 if --subunit option given to selftest.
3327
            bzr_path = [sys.executable] + bzr_path
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3328
        fd, test_list_file_name = tempfile.mkstemp()
3329
        test_list_file = os.fdopen(fd, 'wb', 1)
3330
        for test in process_tests:
3331
            test_list_file.write(test.id() + '\n')
3332
        test_list_file.close()
3333
        try:
4805.2.1 by Gordon Tyler
Fixed reinvoke_for_tests to work on win32.
3334
            argv = bzr_path + ['selftest', '--load-list', test_list_file_name,
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3335
                '--subunit']
3336
            if '--no-plugins' in sys.argv:
3337
                argv.append('--no-plugins')
5273.1.3 by Vincent Ladeuil
Fix typo.
3338
            # stderr=subprocess.STDOUT would be ideal, but until we prevent
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
3339
            # noise on stderr it can interrupt the subunit protocol.
5273.1.3 by Vincent Ladeuil
Fix typo.
3340
            process = subprocess.Popen(argv, stdin=subprocess.PIPE,
3341
                                      stdout=subprocess.PIPE,
3342
                                      stderr=subprocess.PIPE,
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
3343
                                      bufsize=1)
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3344
            test = TestInSubprocess(process, test_list_file_name)
3345
            result.append(test)
3346
        except:
3347
            os.unlink(test_list_file_name)
3348
            raise
3349
    return result
3350
3351
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3352
class ForwardingResult(unittest.TestResult):
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3353
3354
    def __init__(self, target):
3355
        unittest.TestResult.__init__(self)
3356
        self.result = target
3357
3358
    def startTest(self, test):
3359
        self.result.startTest(test)
3360
3361
    def stopTest(self, test):
3362
        self.result.stopTest(test)
3363
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
3364
    def startTestRun(self):
3365
        self.result.startTestRun()
3366
3367
    def stopTestRun(self):
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
3368
        self.result.stopTestRun()
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
3369
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3370
    def addSkip(self, test, reason):
3371
        self.result.addSkip(test, reason)
3372
3373
    def addSuccess(self, test):
3374
        self.result.addSuccess(test)
3375
3376
    def addError(self, test, err):
3377
        self.result.addError(test, err)
3378
3379
    def addFailure(self, test, err):
3380
        self.result.addFailure(test, err)
4794.1.11 by Robert Collins
Remove decorator class that won't be needed with upgraded dependencies.
3381
ForwardingResult = testtools.ExtendedToOriginalDecorator
3382
3383
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3384
class ProfileResult(ForwardingResult):
3385
    """Generate profiling data for all activity between start and success.
3386
    
3387
    The profile data is appended to the test's _benchcalls attribute and can
3388
    be accessed by the forwarded-to TestResult.
3389
3390
    While it might be cleaner do accumulate this in stopTest, addSuccess is
3391
    where our existing output support for lsprof is, and this class aims to
3392
    fit in with that: while it could be moved it's not necessary to accomplish
4641.3.4 by Robert Collins
Fix typo.
3393
    test profiling, nor would it be dramatically cleaner.
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3394
    """
3395
3396
    def startTest(self, test):
3397
        self.profiler = bzrlib.lsprof.BzrProfiler()
5331.1.1 by Robert Collins
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
3398
        # Prevent deadlocks in tests that use lsprof: those tests will
3399
        # unavoidably fail.
3400
        bzrlib.lsprof.BzrProfiler.profiler_block = 0
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3401
        self.profiler.start()
3402
        ForwardingResult.startTest(self, test)
3403
3404
    def addSuccess(self, test):
3405
        stats = self.profiler.stop()
3406
        try:
3407
            calls = test._benchcalls
3408
        except AttributeError:
3409
            test._benchcalls = []
3410
            calls = test._benchcalls
3411
        calls.append(((test.id(), "", ""), stats))
3412
        ForwardingResult.addSuccess(self, test)
3413
3414
    def stopTest(self, test):
3415
        ForwardingResult.stopTest(self, test)
3416
        self.profiler = None
3417
3418
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3419
# Controlled by "bzr selftest -E=..." option
4523.4.9 by John Arbash Meinel
Change the flags around a bit.
3420
# Currently supported:
3421
#   -Eallow_debug           Will no longer clear debug.debug_flags() so it
3422
#                           preserves any flags supplied at the command line.
3423
#   -Edisable_lock_checks   Turns errors in mismatched locks into simple prints
3424
#                           rather than failing tests. And no longer raise
3425
#                           LockContention when fctnl locks are not being used
3426
#                           with proper exclusion rules.
5247.1.2 by Vincent Ladeuil
Fix typo in comment.
3427
#   -Ethreads               Will display thread ident at creation/join time to
4731.2.9 by Vincent Ladeuil
Implement a new -Ethreads to better track the leaks.
3428
#                           help track thread leaks
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3429
selftest_debug_flags = set()
3430
3431
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
3432
def selftest(verbose=False, pattern=".*", stop_on_failure=True,
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
3433
             transport=None,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
3434
             test_suite_factory=None,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
3435
             lsprof_timed=None,
2213.2.1 by Martin Pool
Add selftest --first flag
3436
             bench_history=None,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
3437
             matching_tests_first=None,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
3438
             list_only=False,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3439
             random_seed=None,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
3440
             exclude_pattern=None,
3441
             strict=False,
3193.1.8 by Vincent Ladeuil
Add '--load-list' option to selftest.
3442
             load_list=None,
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3443
             debug_flags=None,
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3444
             starting_with=None,
4000.2.3 by Robert Collins
Allow extra options to bzrlib.tests.selftest from plugins.
3445
             runner_class=None,
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3446
             suite_decorators=None,
4636.2.1 by Robert Collins
Test selftest --list-only and --randomize options using more precisely layers.
3447
             stream=None,
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3448
             lsprof_tests=False,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
3449
             ):
1204 by Martin Pool
doc
3450
    """Run the whole test suite under the enhanced runner"""
1904.2.5 by Martin Pool
Fix format warning inside test suite and add test
3451
    # XXX: Very ugly way to do this...
3452
    # Disable warning about old formats because we don't want it to disturb
3453
    # any blackbox tests.
3454
    from bzrlib import repository
3455
    repository._deprecation_warning_done = True
3456
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.
3457
    global default_transport
3458
    if transport is None:
3459
        transport = default_transport
3460
    old_transport = default_transport
3461
    default_transport = transport
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3462
    global selftest_debug_flags
3463
    old_debug_flags = selftest_debug_flags
3464
    if debug_flags is not None:
3465
        selftest_debug_flags = set(debug_flags)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3466
    try:
3193.1.8 by Vincent Ladeuil
Add '--load-list' option to selftest.
3467
        if load_list is None:
3468
            keep_only = None
3469
        else:
3470
            keep_only = load_test_id_list(load_list)
4641.2.1 by Robert Collins
Resolve test aliases at the outermost level that test skip filtering is done.
3471
        if starting_with:
3472
            starting_with = [test_prefix_alias_registry.resolve_alias(start)
3473
                             for start in starting_with]
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
3474
        if test_suite_factory is None:
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
3475
            # Reduce loading time by loading modules based on the starting_with
3476
            # patterns.
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3477
            suite = test_suite(keep_only, starting_with)
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
3478
        else:
3479
            suite = test_suite_factory()
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
3480
        if starting_with:
3481
            # But always filter as requested.
3482
            suite = filter_suite_by_id_startswith(suite, starting_with)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3483
        result_decorators = []
3484
        if lsprof_tests:
3485
            result_decorators.append(ProfileResult)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3486
        return run_suite(suite, 'testbzr', verbose=verbose, pattern=pattern,
2485.6.6 by Martin Pool
Put test root directory (containing per-test directories) in TMPDIR
3487
                     stop_on_failure=stop_on_failure,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
3488
                     transport=transport,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
3489
                     lsprof_timed=lsprof_timed,
2213.2.1 by Martin Pool
Add selftest --first flag
3490
                     bench_history=bench_history,
2321.2.1 by Alexander Belchenko
`bzr selftest --numbered-dirs` use numbered dirs for TestCaseInTempDir
3491
                     matching_tests_first=matching_tests_first,
2394.2.1 by Ian Clatworthy
--list and --exclude first cut
3492
                     list_only=list_only,
2394.2.2 by Ian Clatworthy
Add --randomize and update help
3493
                     random_seed=random_seed,
2658.3.3 by Daniel Watkins
Added UI support for bzr selftest --strict.
3494
                     exclude_pattern=exclude_pattern,
4000.2.3 by Robert Collins
Allow extra options to bzrlib.tests.selftest from plugins.
3495
                     strict=strict,
3496
                     runner_class=runner_class,
4205.3.2 by Robert Collins
Create fork and reinvoke parallel testing support.
3497
                     suite_decorators=suite_decorators,
4636.2.1 by Robert Collins
Test selftest --list-only and --randomize options using more precisely layers.
3498
                     stream=stream,
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
3499
                     result_decorators=result_decorators,
4000.2.3 by Robert Collins
Allow extra options to bzrlib.tests.selftest from plugins.
3500
                     )
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3501
    finally:
3502
        default_transport = old_transport
3390.1.1 by Andrew Bennetts
Add --debugflags/-E option to selftest.
3503
        selftest_debug_flags = old_debug_flags
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
3504
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
3505
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
3506
def load_test_id_list(file_name):
3507
    """Load a test id list from a text file.
3508
3509
    The format is one test id by line.  No special care is taken to impose
3510
    strict rules, these test ids are used to filter the test suite so a test id
3511
    that do not match an existing test will do no harm. This allows user to add
3512
    comments, leave blank lines, etc.
3513
    """
3514
    test_list = []
3515
    try:
3516
        ftest = open(file_name, 'rt')
3517
    except IOError, e:
3518
        if e.errno != errno.ENOENT:
3519
            raise
3520
        else:
3521
            raise errors.NoSuchFile(file_name)
3522
3523
    for test_name in ftest.readlines():
3524
        test_list.append(test_name.strip())
3525
    ftest.close()
3526
    return test_list
3527
3302.3.3 by Vincent Ladeuil
Fix PEP8 catched by Aaron. Update NEWS.
3528
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3529
def suite_matches_id_list(test_suite, id_list):
3530
    """Warns about tests not appearing or appearing more than once.
3531
3532
    :param test_suite: A TestSuite object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3533
    :param test_id_list: The list of test ids that should be found in
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3534
         test_suite.
3535
3536
    :return: (absents, duplicates) absents is a list containing the test found
3537
        in id_list but not in test_suite, duplicates is a list containing the
3538
        test found multiple times in test_suite.
3539
3540
    When using a prefined test id list, it may occurs that some tests do not
3541
    exist anymore or that some tests use the same id. This function warns the
3542
    tester about potential problems in his workflow (test lists are volatile)
3543
    or in the test suite itself (using the same id for several tests does not
3544
    help to localize defects).
3545
    """
3546
    # Build a dict counting id occurrences
3547
    tests = dict()
3548
    for test in iter_suite_tests(test_suite):
3549
        id = test.id()
3550
        tests[id] = tests.get(id, 0) + 1
3551
3552
    not_found = []
3553
    duplicates = []
3554
    for id in id_list:
3555
        occurs = tests.get(id, 0)
3556
        if not occurs:
3557
            not_found.append(id)
3558
        elif occurs > 1:
3559
            duplicates.append(id)
3560
3561
    return not_found, duplicates
3562
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
3563
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3564
class TestIdList(object):
3565
    """Test id list to filter a test suite.
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
3566
3567
    Relying on the assumption that test ids are built as:
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3568
    <module>[.<class>.<method>][(<param>+)], <module> being in python dotted
3569
    notation, this class offers methods to :
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
3570
    - avoid building a test suite for modules not refered to in the test list,
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
3571
    - keep only the tests listed from the module test suite.
3572
    """
3573
3574
    def __init__(self, test_id_list):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3575
        # When a test suite needs to be filtered against us we compare test ids
3576
        # for equality, so a simple dict offers a quick and simple solution.
3577
        self.tests = dict().fromkeys(test_id_list, True)
3578
3579
        # While unittest.TestCase have ids like:
3580
        # <module>.<class>.<method>[(<param+)],
3581
        # doctest.DocTestCase can have ids like:
3582
        # <module>
3583
        # <module>.<class>
3584
        # <module>.<function>
3585
        # <module>.<class>.<method>
3586
3587
        # Since we can't predict a test class from its name only, we settle on
3588
        # a simple constraint: a test id always begins with its module name.
3589
3590
        modules = {}
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
3591
        for test_id in test_id_list:
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3592
            parts = test_id.split('.')
3593
            mod_name = parts.pop(0)
3594
            modules[mod_name] = True
3595
            for part in parts:
3596
                mod_name += '.' + part
3597
                modules[mod_name] = True
3598
        self.modules = modules
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
3599
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
3600
    def refers_to(self, module_name):
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
3601
        """Is there tests for the module or one of its sub modules."""
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3602
        return self.modules.has_key(module_name)
3603
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
3604
    def includes(self, test_id):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3605
        return self.tests.has_key(test_id)
3193.1.5 by Vincent Ladeuil
Add helper method to get only listed tests from a module test suite.
3606
3193.1.3 by Vincent Ladeuil
Create a TestIdListFilter helper object to make testing easier.
3607
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3608
class TestPrefixAliasRegistry(registry.Registry):
3609
    """A registry for test prefix aliases.
3610
3611
    This helps implement shorcuts for the --starting-with selftest
3612
    option. Overriding existing prefixes is not allowed but not fatal (a
3613
    warning will be emitted).
3614
    """
3615
3616
    def register(self, key, obj, help=None, info=None,
3617
                 override_existing=False):
3618
        """See Registry.register.
3619
3620
        Trying to override an existing alias causes a warning to be emitted,
3621
        not a fatal execption.
3622
        """
3623
        try:
3624
            super(TestPrefixAliasRegistry, self).register(
3625
                key, obj, help=help, info=info, override_existing=False)
3626
        except KeyError:
3627
            actual = self.get(key)
3628
            note('Test prefix alias %s is already used for %s, ignoring %s'
3629
                 % (key, actual, obj))
3630
3631
    def resolve_alias(self, id_start):
3632
        """Replace the alias by the prefix in the given string.
3633
3649.6.3 by Vincent Ladeuil
Fixed typos as per John's review.
3634
        Using an unknown prefix is an error to help catching typos.
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3635
        """
3636
        parts = id_start.split('.')
3637
        try:
3638
            parts[0] = self.get(parts[0])
3639
        except KeyError:
3640
            raise errors.BzrCommandError(
3641
                '%s is not a known test prefix alias' % parts[0])
3642
        return '.'.join(parts)
3643
3644
3645
test_prefix_alias_registry = TestPrefixAliasRegistry()
3649.6.3 by Vincent Ladeuil
Fixed typos as per John's review.
3646
"""Registry of test prefix aliases."""
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3647
3648
3649
# This alias allows to detect typos ('bzrlin.') by making all valid test ids
3650
# appear prefixed ('bzrlib.' is "replaced" by 'bzrlib.').
3651
test_prefix_alias_registry.register('bzrlib', 'bzrlib')
3652
5009.1.1 by Vincent Ladeuil
(trivial) Fix typos
3653
# Obvious highest levels prefixes, feel free to add your own via a plugin
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3654
test_prefix_alias_registry.register('bd', 'bzrlib.doc')
3655
test_prefix_alias_registry.register('bu', 'bzrlib.utils')
3656
test_prefix_alias_registry.register('bt', 'bzrlib.tests')
3657
test_prefix_alias_registry.register('bb', 'bzrlib.tests.blackbox')
3658
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
3659
3660
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3661
def _test_suite_testmod_names():
3662
    """Return the standard list of test module names to test."""
3663
    return [
3664
        'bzrlib.doc',
3665
        'bzrlib.tests.blackbox',
3666
        'bzrlib.tests.commands',
5193.6.2 by Vincent Ladeuil
First texinfo test.
3667
        'bzrlib.tests.doc_generate',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3668
        'bzrlib.tests.per_branch',
5363.2.30 by Jelmer Vernooij
actually run per_bzrdir tests.
3669
        'bzrlib.tests.per_bzrdir',
5363.2.2 by Jelmer Vernooij
Rename per_bzrdir => per_controldir.
3670
        'bzrlib.tests.per_controldir',
3671
        'bzrlib.tests.per_controldir_colo',
4585.1.5 by Jelmer Vernooij
Some review comments from John.
3672
        'bzrlib.tests.per_foreign_vcs',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3673
        'bzrlib.tests.per_interrepository',
3674
        'bzrlib.tests.per_intertree',
3675
        'bzrlib.tests.per_inventory',
3676
        'bzrlib.tests.per_interbranch',
3677
        'bzrlib.tests.per_lock',
4869.2.5 by Andrew Bennetts
Move per-merger tests into a per_merger test module.
3678
        'bzrlib.tests.per_merger',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3679
        'bzrlib.tests.per_transport',
3680
        'bzrlib.tests.per_tree',
3681
        'bzrlib.tests.per_pack_repository',
3682
        'bzrlib.tests.per_repository',
3683
        'bzrlib.tests.per_repository_chk',
3684
        'bzrlib.tests.per_repository_reference',
4711.1.2 by Martin Pool
Start adding tests.per_uifactory
3685
        'bzrlib.tests.per_uifactory',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3686
        'bzrlib.tests.per_versionedfile',
3687
        'bzrlib.tests.per_workingtree',
3688
        'bzrlib.tests.test__annotator',
4913.3.8 by John Arbash Meinel
Rename test_bencode to test__bencode, and use self.module
3689
        'bzrlib.tests.test__bencode',
5365.5.3 by John Arbash Meinel
The results were just too promising. faster *and* better memory.
3690
        'bzrlib.tests.test__btree_serializer',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3691
        'bzrlib.tests.test__chk_map',
3692
        'bzrlib.tests.test__dirstate_helpers',
3693
        'bzrlib.tests.test__groupcompress',
3694
        'bzrlib.tests.test__known_graph',
3695
        'bzrlib.tests.test__rio',
4679.3.76 by John Arbash Meinel
Rename StaticTupleInterner => SimpleSet.
3696
        'bzrlib.tests.test__simple_set',
4679.5.2 by John Arbash Meinel
Merge 2.1-export-c-api branch, and bring back the static_tuple code.
3697
        'bzrlib.tests.test__static_tuple',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3698
        'bzrlib.tests.test__walkdirs_win32',
3699
        'bzrlib.tests.test_ancestry',
3700
        'bzrlib.tests.test_annotate',
3701
        'bzrlib.tests.test_api',
3702
        'bzrlib.tests.test_atomicfile',
3703
        'bzrlib.tests.test_bad_files',
3704
        'bzrlib.tests.test_bisect_multi',
3705
        'bzrlib.tests.test_branch',
3706
        'bzrlib.tests.test_branchbuilder',
3707
        'bzrlib.tests.test_btree_index',
3708
        'bzrlib.tests.test_bugtracker',
3709
        'bzrlib.tests.test_bundle',
3710
        'bzrlib.tests.test_bzrdir',
3711
        'bzrlib.tests.test__chunks_to_lines',
3712
        'bzrlib.tests.test_cache_utf8',
3713
        'bzrlib.tests.test_chk_map',
3714
        'bzrlib.tests.test_chk_serializer',
3715
        'bzrlib.tests.test_chunk_writer',
3716
        'bzrlib.tests.test_clean_tree',
4634.85.12 by Andrew Bennetts
Merge lp:bzr.
3717
        'bzrlib.tests.test_cleanup',
5037.3.2 by Martin Pool
Fix up test_cmdline to actually work
3718
        'bzrlib.tests.test_cmdline',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3719
        'bzrlib.tests.test_commands',
3720
        'bzrlib.tests.test_commit',
3721
        'bzrlib.tests.test_commit_merge',
3722
        'bzrlib.tests.test_config',
3723
        'bzrlib.tests.test_conflicts',
3724
        'bzrlib.tests.test_counted_lock',
3725
        'bzrlib.tests.test_crash',
3726
        'bzrlib.tests.test_decorators',
3727
        'bzrlib.tests.test_delta',
3728
        'bzrlib.tests.test_debug',
3729
        'bzrlib.tests.test_deprecated_graph',
3730
        'bzrlib.tests.test_diff',
3731
        'bzrlib.tests.test_directory_service',
3732
        'bzrlib.tests.test_dirstate',
3733
        'bzrlib.tests.test_email_message',
3734
        'bzrlib.tests.test_eol_filters',
3735
        'bzrlib.tests.test_errors',
3736
        'bzrlib.tests.test_export',
3737
        'bzrlib.tests.test_extract',
3738
        'bzrlib.tests.test_fetch',
5230.1.1 by Martin Pool
Add a simple bzrlib.tests.fixtures
3739
        'bzrlib.tests.test_fixtures',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3740
        'bzrlib.tests.test_fifo_cache',
3741
        'bzrlib.tests.test_filters',
3742
        'bzrlib.tests.test_ftp_transport',
3743
        'bzrlib.tests.test_foreign',
3744
        'bzrlib.tests.test_generate_docs',
3745
        'bzrlib.tests.test_generate_ids',
3746
        'bzrlib.tests.test_globbing',
3747
        'bzrlib.tests.test_gpg',
3748
        'bzrlib.tests.test_graph',
3749
        'bzrlib.tests.test_groupcompress',
3750
        'bzrlib.tests.test_hashcache',
3751
        'bzrlib.tests.test_help',
3752
        'bzrlib.tests.test_hooks',
3753
        'bzrlib.tests.test_http',
3754
        'bzrlib.tests.test_http_response',
3755
        'bzrlib.tests.test_https_ca_bundle',
3756
        'bzrlib.tests.test_identitymap',
3757
        'bzrlib.tests.test_ignores',
3758
        'bzrlib.tests.test_index',
5017.2.2 by Martin Pool
Add import tariff tests
3759
        'bzrlib.tests.test_import_tariff',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3760
        'bzrlib.tests.test_info',
3761
        'bzrlib.tests.test_inv',
3762
        'bzrlib.tests.test_inventory_delta',
3763
        'bzrlib.tests.test_knit',
3764
        'bzrlib.tests.test_lazy_import',
3765
        'bzrlib.tests.test_lazy_regex',
5320.2.2 by Robert Collins
Move BzrLibraryState to its own module and prepare to start testing it.
3766
        'bzrlib.tests.test_library_state',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3767
        'bzrlib.tests.test_lock',
3768
        'bzrlib.tests.test_lockable_files',
3769
        'bzrlib.tests.test_lockdir',
3770
        'bzrlib.tests.test_log',
3771
        'bzrlib.tests.test_lru_cache',
3772
        'bzrlib.tests.test_lsprof',
3773
        'bzrlib.tests.test_mail_client',
5200.3.1 by Robert Collins
Added ``bzrlib.tests.matchers`` as a place to put matchers, along with
3774
        'bzrlib.tests.test_matchers',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3775
        'bzrlib.tests.test_memorytree',
3776
        'bzrlib.tests.test_merge',
3777
        'bzrlib.tests.test_merge3',
3778
        'bzrlib.tests.test_merge_core',
3779
        'bzrlib.tests.test_merge_directive',
3780
        'bzrlib.tests.test_missing',
3781
        'bzrlib.tests.test_msgeditor',
3782
        'bzrlib.tests.test_multiparent',
3783
        'bzrlib.tests.test_mutabletree',
3784
        'bzrlib.tests.test_nonascii',
3785
        'bzrlib.tests.test_options',
3786
        'bzrlib.tests.test_osutils',
3787
        'bzrlib.tests.test_osutils_encodings',
3788
        'bzrlib.tests.test_pack',
3789
        'bzrlib.tests.test_patch',
3790
        'bzrlib.tests.test_patches',
3791
        'bzrlib.tests.test_permissions',
3792
        'bzrlib.tests.test_plugins',
3793
        'bzrlib.tests.test_progress',
3794
        'bzrlib.tests.test_read_bundle',
3795
        'bzrlib.tests.test_reconcile',
3796
        'bzrlib.tests.test_reconfigure',
3797
        'bzrlib.tests.test_registry',
3798
        'bzrlib.tests.test_remote',
3799
        'bzrlib.tests.test_rename_map',
3800
        'bzrlib.tests.test_repository',
3801
        'bzrlib.tests.test_revert',
3802
        'bzrlib.tests.test_revision',
3803
        'bzrlib.tests.test_revisionspec',
3804
        'bzrlib.tests.test_revisiontree',
3805
        'bzrlib.tests.test_rio',
3806
        'bzrlib.tests.test_rules',
3807
        'bzrlib.tests.test_sampler',
4665.5.1 by Vincent Ladeuil
Start some shell-like capability to write tests.
3808
        'bzrlib.tests.test_script',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3809
        'bzrlib.tests.test_selftest',
3810
        'bzrlib.tests.test_serializer',
3811
        'bzrlib.tests.test_setup',
3812
        'bzrlib.tests.test_sftp_transport',
3813
        'bzrlib.tests.test_shelf',
3814
        'bzrlib.tests.test_shelf_ui',
3815
        'bzrlib.tests.test_smart',
3816
        'bzrlib.tests.test_smart_add',
3817
        'bzrlib.tests.test_smart_request',
3818
        'bzrlib.tests.test_smart_transport',
3819
        'bzrlib.tests.test_smtp_connection',
3820
        'bzrlib.tests.test_source',
3821
        'bzrlib.tests.test_ssh_transport',
3822
        'bzrlib.tests.test_status',
3823
        'bzrlib.tests.test_store',
3824
        'bzrlib.tests.test_strace',
3825
        'bzrlib.tests.test_subsume',
3826
        'bzrlib.tests.test_switch',
3827
        'bzrlib.tests.test_symbol_versioning',
3828
        'bzrlib.tests.test_tag',
5247.3.8 by Vincent Ladeuil
Start implementing a TCP server running in its own thread (using
3829
        'bzrlib.tests.test_test_server',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3830
        'bzrlib.tests.test_testament',
3831
        'bzrlib.tests.test_textfile',
3832
        'bzrlib.tests.test_textmerge',
3833
        'bzrlib.tests.test_timestamp',
3834
        'bzrlib.tests.test_trace',
3835
        'bzrlib.tests.test_transactions',
3836
        'bzrlib.tests.test_transform',
3837
        'bzrlib.tests.test_transport',
3838
        'bzrlib.tests.test_transport_log',
3839
        'bzrlib.tests.test_tree',
3840
        'bzrlib.tests.test_treebuilder',
5346.4.1 by Martin Pool
merge fix for bug 128562 back to trunk
3841
        'bzrlib.tests.test_treeshape',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3842
        'bzrlib.tests.test_tsort',
3843
        'bzrlib.tests.test_tuned_gzip',
3844
        'bzrlib.tests.test_ui',
3845
        'bzrlib.tests.test_uncommit',
3846
        'bzrlib.tests.test_upgrade',
3847
        'bzrlib.tests.test_upgrade_stacked',
3848
        'bzrlib.tests.test_urlutils',
3849
        'bzrlib.tests.test_version',
3850
        'bzrlib.tests.test_version_info',
5374.2.2 by John Arbash Meinel
Create a multi-parent diff generator class.
3851
        'bzrlib.tests.test_versionedfile',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3852
        'bzrlib.tests.test_weave',
3853
        'bzrlib.tests.test_whitebox',
3854
        'bzrlib.tests.test_win32utils',
3855
        'bzrlib.tests.test_workingtree',
3856
        'bzrlib.tests.test_workingtree_4',
3857
        'bzrlib.tests.test_wsgi',
3858
        'bzrlib.tests.test_xml',
3859
        ]
3860
3861
3862
def _test_suite_modules_to_doctest():
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
3863
    """Return the list of modules to doctest."""
3864
    if __doc__ is None:
3865
        # GZ 2009-03-31: No docstrings with -OO so there's nothing to doctest
3866
        return []
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3867
    return [
3868
        'bzrlib',
3869
        'bzrlib.branchbuilder',
4869.3.32 by Andrew Bennetts
Use Launchpad's cachedproperty decorator instead of my stupidly broken one.
3870
        'bzrlib.decorators',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3871
        'bzrlib.export',
3872
        'bzrlib.inventory',
3873
        'bzrlib.iterablefile',
3874
        'bzrlib.lockdir',
3875
        'bzrlib.merge3',
3876
        'bzrlib.option',
3877
        'bzrlib.symbol_versioning',
3878
        'bzrlib.tests',
5230.2.1 by Martin Pool
Change simple fixtures to be generators of names and unicode encodings.
3879
        'bzrlib.tests.fixtures',
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3880
        'bzrlib.timestamp',
3881
        'bzrlib.version_info_formats.format_custom',
3882
        ]
3883
3884
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3885
def test_suite(keep_only=None, starting_with=None):
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
3886
    """Build and return TestSuite for the whole of bzrlib.
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3887
3888
    :param keep_only: A list of test ids limiting the suite returned.
3889
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3890
    :param starting_with: An id limiting the suite returned to the tests
3891
         starting with it.
3892
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
3893
    This function can be replaced if you need to change the default test
3894
    suite on a global basis, but it is not encouraged.
3895
    """
3302.9.23 by Vincent Ladeuil
Simplify test_suite().
3896
1707.2.2 by Robert Collins
Start on bench_add, an add benchtest.
3897
    loader = TestUtil.TestLoader()
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3898
4498.1.2 by Vincent Ladeuil
Fix selftest -s xxx --load yyy usage.
3899
    if keep_only is not None:
3900
        id_filter = TestIdList(keep_only)
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3901
    if starting_with:
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3902
        # We take precedence over keep_only because *at loading time* using
3903
        # both options means we will load less tests for the same final result.
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3904
        def interesting_module(name):
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3905
            for start in starting_with:
3906
                if (
3907
                    # Either the module name starts with the specified string
3908
                    name.startswith(start)
3909
                    # or it may contain tests starting with the specified string
3910
                    or start.startswith(name)
3911
                    ):
3912
                    return True
3913
            return False
3302.11.6 by Vincent Ladeuil
Fixed as per Martin and John reviews. Also fix a bug.
3914
        loader = TestUtil.FilteredByModuleTestLoader(interesting_module)
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3915
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3916
    elif keep_only is not None:
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3917
        loader = TestUtil.FilteredByModuleTestLoader(id_filter.refers_to)
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3918
        def interesting_module(name):
3919
            return id_filter.refers_to(name)
3920
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3921
    else:
3922
        loader = TestUtil.TestLoader()
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3923
        def interesting_module(name):
3924
            # No filtering, all modules are interesting
3925
            return True
3926
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3927
    suite = loader.suiteClass()
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3928
3929
    # modules building their suite with loadTestsFromModuleNames
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3930
    suite.addTest(loader.loadTestsFromModuleNames(_test_suite_testmod_names()))
3931
3932
    for mod in _test_suite_modules_to_doctest():
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3933
        if not interesting_module(mod):
3302.8.13 by Vincent Ladeuil
DocTests can now be filtered at module level too.
3934
            # No tests to keep here, move along
3935
            continue
1996.3.5 by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again.
3936
        try:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3937
            # note that this really does mean "report only" -- doctest
3825.3.4 by Martin Pool
Doc
3938
            # still runs the rest of the examples
3825.3.3 by Martin Pool
Doctests now stop on the first failure
3939
            doc_suite = doctest.DocTestSuite(mod,
3825.3.5 by Martin Pool
Fix tab damage
3940
                optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
1996.3.5 by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again.
3941
        except ValueError, e:
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3942
            print '**failed to get doctest for: %s\n%s' % (mod, e)
1996.3.5 by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again.
3943
            raise
3825.3.1 by Martin Pool
selftest errors if modules said to have doctests don't have them
3944
        if len(doc_suite._tests) == 0:
3945
            raise errors.BzrError("no doctests found in %s" % (mod,))
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3946
        suite.addTest(doc_suite)
3947
2762.2.1 by Robert Collins
* ``bzr plugins`` now lists the version number for each plugin in square
3948
    default_encoding = sys.getdefaultencoding()
3221.4.1 by Martin Pool
Treat failure to load plugin test suites as a fatal error
3949
    for name, plugin in bzrlib.plugin.plugins().items():
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3950
        if not interesting_module(plugin.module.__name__):
3951
            continue
3221.4.1 by Martin Pool
Treat failure to load plugin test suites as a fatal error
3952
        plugin_suite = plugin.test_suite()
3953
        # We used to catch ImportError here and turn it into just a warning,
3954
        # but really if you don't have --no-plugins this should be a failure.
3955
        # mbp 20080213 - see http://bugs.launchpad.net/bugs/189771
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3956
        if plugin_suite is None:
3302.8.21 by Vincent Ladeuil
Fixed as per Robert's review.
3957
            plugin_suite = plugin.load_plugin_tests(loader)
3221.4.1 by Martin Pool
Treat failure to load plugin test suites as a fatal error
3958
        if plugin_suite is not None:
3959
            suite.addTest(plugin_suite)
2762.2.1 by Robert Collins
* ``bzr plugins`` now lists the version number for each plugin in square
3960
        if default_encoding != sys.getdefaultencoding():
3961
            bzrlib.trace.warning(
3962
                'Plugin "%s" tried to reset default encoding to: %s', name,
3963
                sys.getdefaultencoding())
3964
            reload(sys)
3965
            sys.setdefaultencoding(default_encoding)
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3966
3967
    if keep_only is not None:
3302.8.12 by Vincent Ladeuil
Simplify tests.test_suite.
3968
        # Now that the referred modules have loaded their tests, keep only the
3969
        # requested ones.
3970
        suite = filter_suite_by_id_list(suite, id_filter)
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3971
        # Do some sanity checks on the id_list filtering
3972
        not_found, duplicates = suite_matches_id_list(suite, keep_only)
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
3973
        if starting_with:
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3974
            # The tester has used both keep_only and starting_with, so he is
3975
            # already aware that some tests are excluded from the list, there
3976
            # is no need to tell him which.
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3977
            pass
3978
        else:
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
3979
            # Some tests mentioned in the list are not in the test suite. The
3980
            # list may be out of date, report to the tester.
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
3981
            for id in not_found:
3982
                bzrlib.trace.warning('"%s" not found in the test suite', id)
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3983
        for id in duplicates:
3984
            bzrlib.trace.warning('"%s" is used as an id by several tests', id)
3985
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
3986
    return suite
764 by Martin Pool
- log messages from a particular test are printed if that test fails
3987
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
3988
2745.6.58 by Andrew Bennetts
Slightly neater test parameterisation in repository_implementations; extract a 'multiply_scenarios' function.
3989
def multiply_scenarios(scenarios_left, scenarios_right):
3990
    """Multiply two sets of scenarios.
3991
3992
    :returns: the cartesian product of the two sets of scenarios, that is
3993
        a scenario for every possible combination of a left scenario and a
3994
        right scenario.
3995
    """
3996
    return [
3997
        ('%s,%s' % (left_name, right_name),
3998
         dict(left_dict.items() + right_dict.items()))
3999
        for left_name, left_dict in scenarios_left
4000
        for right_name, right_dict in scenarios_right]
4001
4002
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4003
def multiply_tests(tests, scenarios, result):
4004
    """Multiply tests_list by scenarios into result.
4005
4006
    This is the core workhorse for test parameterisation.
4007
4008
    Typically the load_tests() method for a per-implementation test suite will
4009
    call multiply_tests and return the result.
4010
4011
    :param tests: The tests to parameterise.
4012
    :param scenarios: The scenarios to apply: pairs of (scenario_name,
4013
        scenario_param_dict).
4014
    :param result: A TestSuite to add created tests to.
4015
4016
    This returns the passed in result TestSuite with the cross product of all
4017
    the tests repeated once for each scenario.  Each test is adapted by adding
4018
    the scenario name at the end of its id(), and updating the test object's
4019
    __dict__ with the scenario_param_dict.
4020
4205.4.1 by Robert Collins
Import needed module for a doctest.
4021
    >>> import bzrlib.tests.test_sampler
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4022
    >>> r = multiply_tests(
4023
    ...     bzrlib.tests.test_sampler.DemoTest('test_nothing'),
4024
    ...     [('one', dict(param=1)),
4025
    ...      ('two', dict(param=2))],
5247.1.1 by Vincent Ladeuil
Merge previous attempt into current trunk
4026
    ...     TestUtil.TestSuite())
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4027
    >>> tests = list(iter_suite_tests(r))
4028
    >>> len(tests)
4029
    2
4030
    >>> tests[0].id()
4031
    'bzrlib.tests.test_sampler.DemoTest.test_nothing(one)'
4032
    >>> tests[0].param
4033
    1
4034
    >>> tests[1].param
4035
    2
4036
    """
4037
    for test in iter_suite_tests(tests):
4038
        apply_scenarios(test, scenarios, result)
4039
    return result
4040
4041
4042
def apply_scenarios(test, scenarios, result):
4043
    """Apply the scenarios in scenarios to test and add to result.
4044
4045
    :param test: The test to apply scenarios to.
4046
    :param scenarios: An iterable of scenarios to apply to test.
4047
    :return: result
4048
    :seealso: apply_scenario
4049
    """
4050
    for scenario in scenarios:
4051
        result.addTest(apply_scenario(test, scenario))
4052
    return result
4053
4054
4055
def apply_scenario(test, scenario):
4056
    """Copy test and apply scenario to it.
4057
4058
    :param test: A test to adapt.
4059
    :param scenario: A tuple describing the scenarion.
4060
        The first element of the tuple is the new test id.
4061
        The second element is a dict containing attributes to set on the
4062
        test.
4063
    :return: The adapted test.
4064
    """
4065
    new_id = "%s(%s)" % (test.id(), scenario[0])
4066
    new_test = clone_test(test, new_id)
4067
    for name, value in scenario[1].items():
4068
        setattr(new_test, name, value)
4069
    return new_test
4070
4071
4072
def clone_test(test, new_id):
4073
    """Clone a test giving it a new id.
4074
4075
    :param test: The test to clone.
4076
    :param new_id: The id to assign to it.
4077
    :return: The new test.
4078
    """
5273.1.1 by Vincent Ladeuil
Cleanup some imports in bzrlib.tests.
4079
    new_test = copy.copy(test)
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4080
    new_test.id = lambda: new_id
5050.33.6 by Andrew Bennetts
Replace __copy__ hack with more direct workaround in clone_test.
4081
    # XXX: Workaround <https://bugs.launchpad.net/testtools/+bug/637725>, which
4082
    # causes cloned tests to share the 'details' dict.  This makes it hard to
4083
    # read the test output for parameterized tests, because tracebacks will be
4084
    # associated with irrelevant tests.
4085
    try:
4086
        details = new_test._TestCase__details
4087
    except AttributeError:
4088
        # must be a different version of testtools than expected.  Do nothing.
4089
        pass
4090
    else:
4091
        # Reset the '__details' dict.
4092
        new_test._TestCase__details = {}
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
4093
    return new_test
3004.1.5 by Daniel Watkins
Added adapt_tests which will adapt tests at a finer-than-module level.
4094
4095
4913.3.1 by John Arbash Meinel
Implement a permute_for_extension helper.
4096
def permute_tests_for_extension(standard_tests, loader, py_module_name,
4097
                                ext_module_name):
4913.3.6 by John Arbash Meinel
Add doc string for permute_tests_for_extension.
4098
    """Helper for permutating tests against an extension module.
4099
4100
    This is meant to be used inside a modules 'load_tests()' function. It will
4101
    create 2 scenarios, and cause all tests in the 'standard_tests' to be run
4102
    against both implementations. Setting 'test.module' to the appropriate
4103
    module. See bzrlib.tests.test__chk_map.load_tests as an example.
4104
4105
    :param standard_tests: A test suite to permute
4106
    :param loader: A TestLoader
4107
    :param py_module_name: The python path to a python module that can always
4108
        be loaded, and will be considered the 'python' implementation. (eg
4109
        'bzrlib._chk_map_py')
4110
    :param ext_module_name: The python path to an extension module. If the
4111
        module cannot be loaded, a single test will be added, which notes that
4112
        the module is not available. If it can be loaded, all standard_tests
4113
        will be run against that module.
4114
    :return: (suite, feature) suite is a test-suite that has all the permuted
4115
        tests. feature is the Feature object that can be used to determine if
4116
        the module is available.
4117
    """
4118
4913.3.1 by John Arbash Meinel
Implement a permute_for_extension helper.
4119
    py_module = __import__(py_module_name, {}, {}, ['NO_SUCH_ATTRIB'])
4120
    scenarios = [
4121
        ('python', {'module': py_module}),
4122
    ]
4123
    suite = loader.suiteClass()
4124
    feature = ModuleAvailableFeature(ext_module_name)
4125
    if feature.available():
4126
        scenarios.append(('C', {'module': feature.module}))
4127
    else:
4128
        # the compiled module isn't available, so we add a failing test
4129
        class FailWithoutFeature(TestCase):
4130
            def test_fail(self):
4131
                self.requireFeature(feature)
4132
        suite.addTest(loader.loadTestsFromTestCase(FailWithoutFeature))
4133
    result = multiply_tests(standard_tests, scenarios, suite)
4134
    return result, feature
4135
4136
4807.3.3 by John Arbash Meinel
Report the test-id when we fail to delete a testing dir.
4137
def _rmtree_temp_dir(dirname, test_id=None):
2485.6.4 by Martin Pool
Move unicode handling code into _rmtree_temp_dir
4138
    # If LANG=C we probably have created some bogus paths
4139
    # which rmtree(unicode) will fail to delete
4140
    # so make sure we are using rmtree(str) to delete everything
4141
    # except on win32, where rmtree(str) will fail
4142
    # since it doesn't have the property of byte-stream paths
4143
    # (they are either ascii or mbcs)
4144
    if sys.platform == 'win32':
4145
        # make sure we are using the unicode win32 api
4146
        dirname = unicode(dirname)
4147
    else:
4148
        dirname = dirname.encode(sys.getfilesystemencoding())
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
4149
    try:
4150
        osutils.rmtree(dirname)
4151
    except OSError, e:
4615.3.2 by Vincent Ladeuil
Allows selftest to finish even without fully cleaning the test dir.
4152
        # We don't want to fail here because some useful display will be lost
4153
        # otherwise. Polluting the tmp dir is bad, but not giving all the
4154
        # possible info to the test runner is even worse.
4807.3.3 by John Arbash Meinel
Report the test-id when we fail to delete a testing dir.
4155
        if test_id != None:
4156
            ui.ui_factory.clear_term()
4857.1.1 by John Arbash Meinel
Add an extra newline. It seems that calling clear_term() just isn't enough.
4157
            sys.stderr.write('\nWhile running: %s\n' % (test_id,))
5229.1.4 by Vincent Ladeuil
Tested, explain the intent.
4158
        # Ugly, but the last thing we want here is fail, so bear with it.
5229.1.5 by Vincent Ladeuil
Even more paranoid fix.
4159
        printable_e = str(e).decode(osutils.get_user_encoding(), 'replace'
5229.1.3 by Vincent Ladeuil
The test should go on !
4160
                                    ).encode('ascii', 'replace')
4615.3.2 by Vincent Ladeuil
Allows selftest to finish even without fully cleaning the test dir.
4161
        sys.stderr.write('Unable to remove testing dir %s\n%s'
5229.1.2 by Vincent Ladeuil
First try at fixing the unicode encoding error.
4162
                         % (os.path.basename(dirname), printable_e))
2379.6.4 by Alexander Belchenko
Teach `bzr selftest --clean-output` to remove read-only files (win32-specific)
4163
4164
2367.1.4 by Robert Collins
Add operating system Feature model to bzrlib.tests to allow writing tests
4165
class Feature(object):
4166
    """An operating system Feature."""
4167
4168
    def __init__(self):
4169
        self._available = None
4170
4171
    def available(self):
4172
        """Is the feature available?
4173
4174
        :return: True if the feature is available.
4175
        """
4176
        if self._available is None:
4177
            self._available = self._probe()
4178
        return self._available
4179
4180
    def _probe(self):
4181
        """Implement this method in concrete features.
4182
4183
        :return: True if the feature is available.
4184
        """
4185
        raise NotImplementedError
4186
4187
    def __str__(self):
4188
        if getattr(self, 'feature_name', None):
4189
            return self.feature_name()
4190
        return self.__class__.__name__
2553.2.3 by Robert Collins
Split out the common test scenario support from the repository implementation specific code.
4191
4192
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
4193
class _SymlinkFeature(Feature):
4194
4195
    def _probe(self):
4196
        return osutils.has_symlinks()
4197
4198
    def feature_name(self):
4199
        return 'symlinks'
4200
4201
SymlinkFeature = _SymlinkFeature()
4202
4203
3136.1.1 by Aaron Bentley
Add support for hardlinks to TreeTransform
4204
class _HardlinkFeature(Feature):
4205
4206
    def _probe(self):
4207
        return osutils.has_hardlinks()
4208
4209
    def feature_name(self):
4210
        return 'hardlinks'
4211
4212
HardlinkFeature = _HardlinkFeature()
4213
4214
2949.5.2 by Alexander Belchenko
John's review
4215
class _OsFifoFeature(Feature):
4216
4217
    def _probe(self):
4218
        return getattr(os, 'mkfifo', None)
4219
4220
    def feature_name(self):
4221
        return 'filesystem fifos'
4222
4223
OsFifoFeature = _OsFifoFeature()
4224
4225
3477.1.2 by John Arbash Meinel
Rename UnicodeFilename => UnicodeFilenameFeature
4226
class _UnicodeFilenameFeature(Feature):
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
4227
    """Does the filesystem support Unicode filenames?"""
4228
4229
    def _probe(self):
4230
        try:
3526.2.1 by Martin von Gagern
Improved UnicodeFilenameFeature.
4231
            # Check for character combinations unlikely to be covered by any
4232
            # single non-unicode encoding. We use the characters
4233
            # - greek small letter alpha (U+03B1) and
4234
            # - braille pattern dots-123456 (U+283F).
4235
            os.stat(u'\u03b1\u283f')
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
4236
        except UnicodeEncodeError:
4237
            return False
4238
        except (IOError, OSError):
4239
            # The filesystem allows the Unicode filename but the file doesn't
4240
            # exist.
4241
            return True
4242
        else:
4243
            # The filesystem allows the Unicode filename and the file exists,
4244
            # for some reason.
4245
            return True
4246
3477.1.2 by John Arbash Meinel
Rename UnicodeFilename => UnicodeFilenameFeature
4247
UnicodeFilenameFeature = _UnicodeFilenameFeature()
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
4248
4249
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
4250
class _CompatabilityThunkFeature(Feature):
4251
    """This feature is just a thunk to another feature.
4252
4253
    It issues a deprecation warning if it is accessed, to let you know that you
4254
    should really use a different feature.
4255
    """
4256
5003.2.1 by Vincent Ladeuil
Avoid infinite recursion when probing for apport.
4257
    def __init__(self, dep_version, module, name,
4258
                 replacement_name, replacement_module=None):
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
4259
        super(_CompatabilityThunkFeature, self).__init__()
4260
        self._module = module
5003.2.1 by Vincent Ladeuil
Avoid infinite recursion when probing for apport.
4261
        if replacement_module is None:
4262
            replacement_module = module
4263
        self._replacement_module = replacement_module
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
4264
        self._name = name
5003.2.1 by Vincent Ladeuil
Avoid infinite recursion when probing for apport.
4265
        self._replacement_name = replacement_name
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
4266
        self._dep_version = dep_version
4267
        self._feature = None
4268
4269
    def _ensure(self):
4270
        if self._feature is None:
5003.2.1 by Vincent Ladeuil
Avoid infinite recursion when probing for apport.
4271
            depr_msg = self._dep_version % ('%s.%s'
4272
                                            % (self._module, self._name))
4273
            use_msg = ' Use %s.%s instead.' % (self._replacement_module,
4274
                                               self._replacement_name)
4275
            symbol_versioning.warn(depr_msg + use_msg, DeprecationWarning)
5003.2.3 by Vincent Ladeuil
Just delete ApportFeature.
4276
            # Import the new feature and use it as a replacement for the
4277
            # deprecated one.
5003.2.1 by Vincent Ladeuil
Avoid infinite recursion when probing for apport.
4278
            mod = __import__(self._replacement_module, {}, {},
4279
                             [self._replacement_name])
4280
            self._feature = getattr(mod, self._replacement_name)
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
4281
4282
    def _probe(self):
4283
        self._ensure()
4284
        return self._feature._probe()
4285
4286
4873.2.3 by John Arbash Meinel
Change from _ModuleFeature to ModuleAvailableFeature, per vila's review.
4287
class ModuleAvailableFeature(Feature):
4873.2.1 by John Arbash Meinel
Add a helper _ModuleFeature.
4288
    """This is a feature than describes a module we want to be available.
4289
4290
    Declare the name of the module in __init__(), and then after probing, the
4291
    module will be available as 'self.module'.
4292
4293
    :ivar module: The module if it is available, else None.
4294
    """
4295
4296
    def __init__(self, module_name):
4873.2.3 by John Arbash Meinel
Change from _ModuleFeature to ModuleAvailableFeature, per vila's review.
4297
        super(ModuleAvailableFeature, self).__init__()
4873.2.1 by John Arbash Meinel
Add a helper _ModuleFeature.
4298
        self.module_name = module_name
4299
4300
    def _probe(self):
4301
        try:
4302
            self._module = __import__(self.module_name, {}, {}, [''])
4303
            return True
4304
        except ImportError:
4305
            return False
4306
4307
    @property
4308
    def module(self):
4309
        if self.available(): # Make sure the probe has been done
4310
            return self._module
4311
        return None
5003.2.1 by Vincent Ladeuil
Avoid infinite recursion when probing for apport.
4312
4873.2.1 by John Arbash Meinel
Add a helper _ModuleFeature.
4313
    def feature_name(self):
4314
        return self.module_name
4315
4316
4913.2.16 by John Arbash Meinel
Move bzrlib.tests.ParamikoFeature to bzrlib.tests.features.paramiko
4317
# This is kept here for compatibility, it is recommended to use
4318
# 'bzrlib.tests.feature.paramiko' instead
5003.2.2 by Vincent Ladeuil
Fix all uses of _CompatabilityThunkFeature.
4319
ParamikoFeature = _CompatabilityThunkFeature(
4320
    deprecated_in((2,1,0)),
4321
    'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
4913.2.11 by John Arbash Meinel
Convert a bunch more features over to ModuleAvailableFeature
4322
4873.2.1 by John Arbash Meinel
Add a helper _ModuleFeature.
4323
2785.1.5 by Alexander Belchenko
support for non-ascii BZR_HOME in show_version()
4324
def probe_unicode_in_user_encoding():
4325
    """Try to encode several unicode strings to use in unicode-aware tests.
4326
    Return first successfull match.
4327
4328
    :return:  (unicode value, encoded plain string value) or (None, None)
4329
    """
4330
    possible_vals = [u'm\xb5', u'\xe1', u'\u0410']
4331
    for uni_val in possible_vals:
4332
        try:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
4333
            str_val = uni_val.encode(osutils.get_user_encoding())
2785.1.5 by Alexander Belchenko
support for non-ascii BZR_HOME in show_version()
4334
        except UnicodeEncodeError:
4335
            # Try a different character
4336
            pass
4337
        else:
4338
            return uni_val, str_val
4339
    return None, None
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4340
4341
2839.6.2 by Alexander Belchenko
changes after Martin's review
4342
def probe_bad_non_ascii(encoding):
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4343
    """Try to find [bad] character with code [128..255]
2839.6.2 by Alexander Belchenko
changes after Martin's review
4344
    that cannot be decoded to unicode in some encoding.
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4345
    Return None if all non-ascii characters is valid
2839.6.2 by Alexander Belchenko
changes after Martin's review
4346
    for given encoding.
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4347
    """
4348
    for i in xrange(128, 256):
4349
        char = chr(i)
4350
        try:
2839.6.2 by Alexander Belchenko
changes after Martin's review
4351
            char.decode(encoding)
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
4352
        except UnicodeDecodeError:
4353
            return char
4354
    return None
2917.3.1 by Vincent Ladeuil
Separate transport from test server.
4355
4356
2929.3.10 by Vincent Ladeuil
Add a fake https server and test facilities.
4357
class _HTTPSServerFeature(Feature):
4358
    """Some tests want an https Server, check if one is available.
4359
2929.3.12 by Vincent Ladeuil
Implement an https server passing the same tests than http. Except
4360
    Right now, the only way this is available is under python2.6 which provides
4361
    an ssl module.
2929.3.10 by Vincent Ladeuil
Add a fake https server and test facilities.
4362
    """
4363
4364
    def _probe(self):
2929.3.12 by Vincent Ladeuil
Implement an https server passing the same tests than http. Except
4365
        try:
4366
            import ssl
4367
            return True
4368
        except ImportError:
4369
            return False
2929.3.10 by Vincent Ladeuil
Add a fake https server and test facilities.
4370
4371
    def feature_name(self):
4372
        return 'HTTPSServer'
4373
4374
4375
HTTPSServerFeature = _HTTPSServerFeature()
2929.3.14 by Vincent Ladeuil
Merge bzr.dev
4376
4377
3287.20.2 by John Arbash Meinel
Raise a clear error about the offending filename when there is a filename with bad characters.
4378
class _UnicodeFilename(Feature):
4379
    """Does the filesystem support Unicode filenames?"""
4380
4381
    def _probe(self):
4382
        try:
4383
            os.stat(u'\u03b1')
4384
        except UnicodeEncodeError:
4385
            return False
4386
        except (IOError, OSError):
4387
            # The filesystem allows the Unicode filename but the file doesn't
4388
            # exist.
4389
            return True
4390
        else:
4391
            # The filesystem allows the Unicode filename and the file exists,
4392
            # for some reason.
4393
            return True
4394
4395
UnicodeFilename = _UnicodeFilename()
4396
4397
5279.2.10 by Eric Moritz
Added a ByteStringNamedFilesystem per Martin Pool's request
4398
class _ByteStringNamedFilesystem(Feature):
4399
    """Is the filesystem based on bytes?"""
4400
4401
    def _probe(self):
4402
        if os.name == "posix":
4403
            return True
4404
        return False
4405
4406
ByteStringNamedFilesystem = _ByteStringNamedFilesystem()
4407
4408
3287.20.2 by John Arbash Meinel
Raise a clear error about the offending filename when there is a filename with bad characters.
4409
class _UTF8Filesystem(Feature):
4410
    """Is the filesystem UTF-8?"""
4411
4412
    def _probe(self):
4413
        if osutils._fs_enc.upper() in ('UTF-8', 'UTF8'):
4414
            return True
4415
        return False
4416
4417
UTF8Filesystem = _UTF8Filesystem()
4418
4419
4715.2.1 by Robert Collins
Stop caring about a clean shutdown of the process in tests for the interactive debugger break-in facility.
4420
class _BreakinFeature(Feature):
4421
    """Does this platform support the breakin feature?"""
4422
4423
    def _probe(self):
4424
        from bzrlib import breakin
4425
        if breakin.determine_signal() is None:
4426
            return False
4427
        if sys.platform == 'win32':
4428
            # Windows doesn't have os.kill, and we catch the SIGBREAK signal.
4429
            # We trigger SIGBREAK via a Console api so we need ctypes to
4430
            # access the function
4789.5.1 by John Arbash Meinel
Simple test suite fix for a variable that didn't exist.
4431
            try:
4432
                import ctypes
4433
            except OSError:
4715.2.1 by Robert Collins
Stop caring about a clean shutdown of the process in tests for the interactive debugger break-in facility.
4434
                return False
4435
        return True
4436
4437
    def feature_name(self):
4438
        return "SIGQUIT or SIGBREAK w/ctypes on win32"
4439
4440
4441
BreakinFeature = _BreakinFeature()
4442
4443
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
4444
class _CaseInsCasePresFilenameFeature(Feature):
4445
    """Is the file-system case insensitive, but case-preserving?"""
4446
4447
    def _probe(self):
4448
        fileno, name = tempfile.mkstemp(prefix='MixedCase')
4449
        try:
4450
            # first check truly case-preserving for created files, then check
4451
            # case insensitive when opening existing files.
4452
            name = osutils.normpath(name)
4453
            base, rel = osutils.split(name)
4454
            found_rel = osutils.canonical_relpath(base, name)
3932.3.1 by Martin Pool
merge cicp patch, correct rest syntax and news typo
4455
            return (found_rel == rel
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
4456
                    and os.path.isfile(name.upper())
4457
                    and os.path.isfile(name.lower()))
4458
        finally:
4459
            os.close(fileno)
4460
            os.remove(name)
4461
4462
    def feature_name(self):
4463
        return "case-insensitive case-preserving filesystem"
4464
4465
CaseInsCasePresFilenameFeature = _CaseInsCasePresFilenameFeature()
4466
4467
3063.1.1 by Alexander Belchenko
Catch OSError 17 (file exists) in final phase of tree transform and show filename to user (#111758).
4468
class _CaseInsensitiveFilesystemFeature(Feature):
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
4469
    """Check if underlying filesystem is case-insensitive but *not* case
4470
    preserving.
3063.1.1 by Alexander Belchenko
Catch OSError 17 (file exists) in final phase of tree transform and show filename to user (#111758).
4471
    """
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
4472
    # Note that on Windows, Cygwin, MacOS etc, the file-systems are far
4473
    # more likely to be case preserving, so this case is rare.
3063.1.1 by Alexander Belchenko
Catch OSError 17 (file exists) in final phase of tree transform and show filename to user (#111758).
4474
4475
    def _probe(self):
3794.5.26 by Mark Hammond
Make the CaseInsCasePresFilenameFeature mutually exclusive from CaseInsCasePresFilenameFeature as the semantics differ in meaningful ways.
4476
        if CaseInsCasePresFilenameFeature.available():
4477
            return False
4478
3063.1.1 by Alexander Belchenko
Catch OSError 17 (file exists) in final phase of tree transform and show filename to user (#111758).
4479
        if TestCaseWithMemoryTransport.TEST_ROOT is None:
4480
            root = osutils.mkdtemp(prefix='testbzr-', suffix='.tmp')
4481
            TestCaseWithMemoryTransport.TEST_ROOT = root
4482
        else:
4483
            root = TestCaseWithMemoryTransport.TEST_ROOT
4484
        tdir = osutils.mkdtemp(prefix='case-sensitive-probe-', suffix='',
4485
            dir=root)
4486
        name_a = osutils.pathjoin(tdir, 'a')
4487
        name_A = osutils.pathjoin(tdir, 'A')
4488
        os.mkdir(name_a)
4489
        result = osutils.isdir(name_A)
4490
        _rmtree_temp_dir(tdir)
4491
        return result
4492
4493
    def feature_name(self):
4494
        return 'case-insensitive filesystem'
4495
4496
CaseInsensitiveFilesystemFeature = _CaseInsensitiveFilesystemFeature()
4165.1.1 by Robert Collins
Add builtin subunit support.
4497
4498
4634.131.3 by Martin Pool
Add case_sensitive_filesystem_feature
4499
class _CaseSensitiveFilesystemFeature(Feature):
4500
4501
    def _probe(self):
4634.131.7 by Martin Pool
cleanup unnecessary import
4502
        if CaseInsCasePresFilenameFeature.available():
4634.131.3 by Martin Pool
Add case_sensitive_filesystem_feature
4503
            return False
4634.131.7 by Martin Pool
cleanup unnecessary import
4504
        elif CaseInsensitiveFilesystemFeature.available():
4634.131.3 by Martin Pool
Add case_sensitive_filesystem_feature
4505
            return False
4506
        else:
4507
            return True
4508
4509
    def feature_name(self):
4510
        return 'case-sensitive filesystem'
4511
4512
# new coding style is for feature instances to be lowercase
4513
case_sensitive_filesystem_feature = _CaseSensitiveFilesystemFeature()
4514
4515
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
4516
# Kept for compatibility, use bzrlib.tests.features.subunit instead
5003.2.2 by Vincent Ladeuil
Fix all uses of _CompatabilityThunkFeature.
4517
SubUnitFeature = _CompatabilityThunkFeature(
4518
    deprecated_in((2,1,0)),
4519
    'bzrlib.tests.features', 'SubUnitFeature', 'subunit')
4165.1.1 by Robert Collins
Add builtin subunit support.
4520
# Only define SubUnitBzrRunner if subunit is available.
4521
try:
4522
    from subunit import TestProtocolClient
4794.1.20 by Robert Collins
Appropriately guard the import of AutoTimingTestResultDecorator from subunit.
4523
    from subunit.test_results import AutoTimingTestResultDecorator
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
4524
    class SubUnitBzrProtocolClient(TestProtocolClient):
4525
4526
        def addSuccess(self, test, details=None):
4527
            # The subunit client always includes the details in the subunit
4528
            # stream, but we don't want to include it in ours.
5387.2.9 by John Arbash Meinel
Have to handle when details is None
4529
            if details is not None and 'log' in details:
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
4530
                del details['log']
4531
            return super(SubUnitBzrProtocolClient, self).addSuccess(
4532
                test, details)
4533
4165.1.1 by Robert Collins
Add builtin subunit support.
4534
    class SubUnitBzrRunner(TextTestRunner):
4535
        def run(self, test):
4794.1.11 by Robert Collins
Remove decorator class that won't be needed with upgraded dependencies.
4536
            result = AutoTimingTestResultDecorator(
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
4537
                SubUnitBzrProtocolClient(self.stream))
4165.1.1 by Robert Collins
Add builtin subunit support.
4538
            test.run(result)
4539
            return result
4540
except ImportError:
4541
    pass
4634.148.1 by Martin Pool
Backport fix for permissions of backup.bzr
4542
4543
class _PosixPermissionsFeature(Feature):
4544
4545
    def _probe(self):
4546
        def has_perms():
4547
            # create temporary file and check if specified perms are maintained.
4548
            import tempfile
4549
4550
            write_perms = stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
4551
            f = tempfile.mkstemp(prefix='bzr_perms_chk_')
4552
            fd, name = f
4553
            os.close(fd)
4554
            os.chmod(name, write_perms)
4555
4556
            read_perms = os.stat(name).st_mode & 0777
4557
            os.unlink(name)
4558
            return (write_perms == read_perms)
4559
4560
        return (os.name == 'posix') and has_perms()
4561
4562
    def feature_name(self):
4563
        return 'POSIX permissions support'
4564
4634.148.4 by Martin Pool
Rename to posix_permissions_feature in accordance with new style
4565
posix_permissions_feature = _PosixPermissionsFeature()