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