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