76
76
from bzrlib.merge import merge_inner
77
77
import bzrlib.merge3
78
78
import bzrlib.plugin
79
from bzrlib.smart import client, server
79
80
import bzrlib.store
80
81
from bzrlib import symbol_versioning
81
82
from bzrlib.symbol_versioning import (
162
163
self.unsupported = {}
164
165
self._overall_start_time = time.time()
166
167
def _extractBenchmarkTime(self, testCase):
167
168
"""Add a benchmark time for the current test case."""
168
169
return getattr(testCase, "_benchtime", None)
170
171
def _elapsedTestTimeString(self):
171
172
"""Return a time string for the overall time the current test has taken."""
172
173
return self._formatTime(time.time() - self._start_time)
276
277
"""The test will not be run because of a missing feature.
278
279
# this can be called in two different ways: it may be that the
279
# test started running, and then raised (through addError)
280
# test started running, and then raised (through addError)
280
281
# UnavailableFeature. Alternatively this method can be called
281
282
# while probing for features before running the tests; in that
282
283
# case we will see startTest and stopTest, but the test will never
395
396
self._progress_prefix_text()
397
398
+ self._shortened_test_description(test))
399
400
def _test_description(self, test):
400
401
return self._shortened_test_description(test)
402
403
def report_error(self, test, err):
403
self.pb.note('ERROR: %s\n %s\n',
404
self.pb.note('ERROR: %s\n %s\n',
404
405
self._test_description(test),
408
409
def report_failure(self, test, err):
409
self.pb.note('FAIL: %s\n %s\n',
410
self.pb.note('FAIL: %s\n %s\n',
410
411
self._test_description(test),
424
425
def report_unsupported(self, test, feature):
425
426
"""test cannot be run because feature is missing."""
427
428
def report_cleaning_up(self):
428
429
self.pb.update('cleaning up...')
601
602
class TestNotApplicable(TestSkipped):
602
603
"""A test is not applicable to the situation where it was run.
604
This is only normally raised by parameterized tests, if they find that
605
the instance they're constructed upon does not support one aspect
605
This is only normally raised by parameterized tests, if they find that
606
the instance they're constructed upon does not support one aspect
606
607
of its interface.
631
632
class StringIOWrapper(object):
632
633
"""A wrapper around cStringIO which just adds an encoding attribute.
634
635
Internally we can check sys.stdout to see what the output encoding
635
636
should be. However, cStringIO has no encoding attribute that we can
636
637
set. So we wrap it instead.
728
729
class TestCase(unittest.TestCase):
729
730
"""Base class for bzr unit tests.
731
Tests that need access to disk resources should subclass
732
Tests that need access to disk resources should subclass
732
733
TestCaseInTempDir not TestCase.
734
735
Error and debug log messages are redirected from their usual
736
737
retrieved by _get_log(). We use a real OS file, not an in-memory object,
737
738
so that it can also capture file IO. When the test completes this file
738
739
is read into memory and removed from disk.
740
741
There are also convenience functions to invoke bzr's command-line
741
742
routine, and to build and check bzr trees.
743
744
In addition to the usual method of overriding tearDown(), this class also
744
745
allows subclasses to register functions into the _cleanups list, which is
745
746
run in order as the object is torn down. It's less likely this will be
860
861
def assertEqualDiff(self, a, b, message=None):
861
862
"""Assert two texts are equal, if not raise an exception.
863
This is intended for use with multi-line strings where it can
864
This is intended for use with multi-line strings where it can
864
865
be hard to find the differences by eye.
866
867
# TODO: perhaps override assertEquals to call this for strings?
874
875
message = 'second string is missing a final newline.\n'
875
876
raise AssertionError(message +
876
877
self._ndiff_strings(a, b))
878
879
def assertEqualMode(self, mode, mode_test):
879
880
self.assertEqual(mode, mode_test,
880
881
'mode mismatch %o != %o' % (mode, mode_test))
939
940
def assertListRaises(self, excClass, func, *args, **kwargs):
940
941
"""Fail unless excClass is raised when the iterator from func is used.
942
943
Many functions can return generators this makes sure
943
944
to wrap them in a list() call to make sure the whole generator
944
945
is run, and that the proper exception is raised.
993
994
def assertTransportMode(self, transport, path, mode):
994
995
"""Fail if a path does not have mode mode.
996
997
If modes are not supported on this transport, the assertion is ignored.
998
999
if not transport._can_roundtrip_unix_modebits():
1169
1170
def callDeprecated(self, expected, callable, *args, **kwargs):
1170
1171
"""Assert that a callable is deprecated in a particular way.
1172
This is a very precise test for unusual requirements. The
1173
This is a very precise test for unusual requirements. The
1173
1174
applyDeprecated helper function is probably more suited for most tests
1174
1175
as it allows you to simply specify the deprecation format being used
1175
1176
and will ensure that that is issued for the function being called.
1220
1221
def addCleanup(self, callable, *args, **kwargs):
1221
1222
"""Arrange to run a callable when this case is torn down.
1223
Callables are run in the reverse of the order they are registered,
1224
Callables are run in the reverse of the order they are registered,
1224
1225
ie last-in first-out.
1226
1227
self._cleanups.append((callable, args, kwargs))
1310
1311
def time(self, callable, *args, **kwargs):
1311
1312
"""Run callable and accrue the time it takes to the benchmark time.
1313
1314
If lsprofiling is enabled (i.e. by --lsprof-time to bzr selftest) then
1314
1315
this will cause lsprofile statistics to be gathered and stored in
1315
1316
self._benchcalls.
1330
1331
self._benchtime += time.time() - start
1332
1333
def _runCleanups(self):
1333
"""Run registered cleanup functions.
1334
"""Run registered cleanup functions.
1335
1336
This should only be called from TestCase.tearDown.
1337
# TODO: Perhaps this should keep running cleanups even if
1338
# TODO: Perhaps this should keep running cleanups even if
1338
1339
# one of them fails?
1340
1341
# Actually pop the cleanups from the list so tearDown running
1456
1457
passed in three ways:
1458
1459
1- A list of strings, eg ["commit", "a"]. This is recommended
1459
when the command contains whitespace or metacharacters, or
1460
when the command contains whitespace or metacharacters, or
1460
1461
is built up at run time.
1462
2- A single string, eg "add a". This is the most convenient
1463
2- A single string, eg "add a". This is the most convenient
1463
1464
for hardcoded commands.
1465
1466
This runs bzr through the interface that catches and reports
1524
1525
def run_bzr_subprocess(self, *args, **kwargs):
1525
1526
"""Run bzr in a subprocess for testing.
1527
This starts a new Python interpreter and runs bzr in there.
1528
This starts a new Python interpreter and runs bzr in there.
1528
1529
This should only be used for tests that have a justifiable need for
1529
1530
this isolation: e.g. they are testing startup time, or signal
1530
handling, or early startup code, etc. Subprocess code can't be
1531
handling, or early startup code, etc. Subprocess code can't be
1531
1532
profiled or debugged so easily.
1533
1534
:keyword retcode: The status code that is expected. Defaults to 0. If
1774
1775
def __init__(self, methodName='runTest'):
1775
1776
# allow test parameterization after test construction and before test
1776
# execution. Variables that the parameterizer sets need to be
1777
# execution. Variables that the parameterizer sets need to be
1777
1778
# ones that are not set by setUp, or setUp will trash them.
1778
1779
super(TestCaseWithMemoryTransport, self).__init__(methodName)
1779
1780
self.vfs_transport_factory = default_transport
1796
1797
def get_readonly_transport(self, relpath=None):
1797
1798
"""Return a readonly transport for the test scratch space
1799
1800
This can be used to test that operations which should only need
1800
1801
readonly access in fact do not try to write.
1832
1833
def get_readonly_url(self, relpath=None):
1833
1834
"""Get a URL for the readonly transport.
1835
This will either be backed by '.' or a decorator to the transport
1836
This will either be backed by '.' or a decorator to the transport
1836
1837
used by self.get_url()
1837
1838
relpath provides for clients to get a path relative to the base url.
1838
1839
These should only be downwards relative, not upwards.
1972
1973
def makeAndChdirToTestDir(self):
1973
1974
"""Create a temporary directories for this one test.
1975
1976
This must set self.test_home_dir and self.test_dir and chdir to
1978
1979
For TestCaseWithMemoryTransport we chdir to the TEST_ROOT for this test.
1980
1981
os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
1981
1982
self.test_dir = TestCaseWithMemoryTransport.TEST_ROOT
1982
1983
self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
1984
1985
def make_branch(self, relpath, format=None):
1985
1986
"""Create a branch on the transport at relpath."""
1986
1987
repo = self.make_repository(relpath, format=format)
2005
2006
def make_repository(self, relpath, shared=False, format=None):
2006
2007
"""Create a repository on our default transport at relpath.
2008
2009
Note that relpath must be a relative path, not a full url.
2010
2011
# FIXME: If you create a remoterepository this returns the underlying
2011
# real format, which is incorrect. Actually we should make sure that
2012
# real format, which is incorrect. Actually we should make sure that
2012
2013
# RemoteBzrDir returns a RemoteRepository.
2013
2014
# maybe mbp 20070410
2014
2015
made_control = self.make_bzrdir(relpath, format=format)
2027
2028
def overrideEnvironmentForTesting(self):
2028
2029
os.environ['HOME'] = self.test_home_dir
2029
2030
os.environ['BZR_HOME'] = self.test_home_dir
2031
2032
def setUp(self):
2032
2033
super(TestCaseWithMemoryTransport, self).setUp()
2033
2034
self._make_test_root()
2041
2042
self.__server = None
2042
2043
self.reduceLockdirTimeout()
2045
def setup_smart_server_with_call_log(self):
2046
"""Sets up a smart server as the transport server with a call log."""
2047
self.transport_server = server.SmartTCPServer_for_testing
2048
self.hpss_calls = []
2049
def capture_hpss_call(params):
2051
self.hpss_calls.append((params, traceback.format_stack()))
2052
client._SmartClient.hooks.install_named_hook(
2053
'call', capture_hpss_call, None)
2055
def reset_smart_call_log(self):
2056
self.hpss_calls = []
2045
2059
class TestCaseInTempDir(TestCaseWithMemoryTransport):
2046
2060
"""Derived class that runs a test within a temporary directory.
2052
2066
All test cases create their own directory within that. If the
2053
2067
tests complete successfully, the directory is removed.
2055
:ivar test_base_dir: The path of the top-level directory for this
2069
:ivar test_base_dir: The path of the top-level directory for this
2056
2070
test, which contains a home directory and a work directory.
2058
2072
:ivar test_home_dir: An initially empty directory under test_base_dir
2085
2099
def makeAndChdirToTestDir(self):
2086
2100
"""See TestCaseWithMemoryTransport.makeAndChdirToTestDir().
2088
2102
For TestCaseInTempDir we create a temporary directory based on the test
2089
2103
name and then create two subdirs - test and home under it.
2189
2203
ReadonlyTransportDecorator is used instead which allows the use of non disk
2190
2204
based read write transports.
2192
If an explicit class is provided for readonly access, that server and the
2206
If an explicit class is provided for readonly access, that server and the
2193
2207
readwrite one must both define get_url() as resolving to os.getcwd().
2307
2321
def condition_isinstance(klass_or_klass_list):
2308
2322
"""Create a condition filter which returns isinstance(param, klass).
2310
2324
:return: A callable which when called with one parameter obj return the
2311
2325
result of isinstance(obj, klass_or_klass_list).
2318
2332
def condition_id_in_list(id_list):
2319
2333
"""Create a condition filter which verify that test's id in a list.
2321
2335
:param id_list: A TestIdList object.
2322
2336
:return: A callable that returns True if the test's id appears in the list.
2329
2343
def condition_id_startswith(starts):
2330
2344
"""Create a condition filter verifying that test's id starts with a string.
2332
2346
:param starts: A list of string.
2333
:return: A callable that returns True if the test's id starts with one of
2347
:return: A callable that returns True if the test's id starts with one of
2334
2348
the given strings.
2336
2350
def condition(test):
2360
2374
def filter_suite_by_condition(suite, condition):
2361
2375
"""Create a test suite by filtering another one.
2363
2377
:param suite: The source suite.
2364
2378
:param condition: A callable whose result evaluates True when called with a
2365
2379
test case which should be included in the result.
2376
2390
def filter_suite_by_re(suite, pattern):
2377
2391
"""Create a test suite by filtering another one.
2379
2393
:param suite: the source suite
2380
2394
:param pattern: pattern that names must match
2381
2395
:returns: the newly created suite
2434
2448
def randomize_suite(suite):
2435
2449
"""Return a new TestSuite with suite's tests in random order.
2437
2451
The tests in the input suite are flattened into a single suite in order to
2438
2452
accomplish this. Any nested TestSuites are removed to provide global
2446
2460
def split_suite_by_condition(suite, condition):
2447
2461
"""Split a test suite into two by a condition.
2449
2463
:param suite: The suite to split.
2450
2464
:param condition: The condition to match on. Tests that match this
2451
2465
condition are returned in the first test suite, ones that do not match
2468
2482
def split_suite_by_re(suite, pattern):
2469
2483
"""Split a test suite into two by a regular expression.
2471
2485
:param suite: The suite to split.
2472
2486
:param pattern: A regular expression string. Test ids that match this
2473
2487
pattern will be in the first test suite returned, and the others in the
2636
2650
"""Warns about tests not appearing or appearing more than once.
2638
2652
:param test_suite: A TestSuite object.
2639
:param test_id_list: The list of test ids that should be found in
2653
:param test_id_list: The list of test ids that should be found in
2642
2656
:return: (absents, duplicates) absents is a list containing the test found
2992
3006
# No tests to keep here, move along
2995
# note that this really does mean "report only" -- doctest
3009
# note that this really does mean "report only" -- doctest
2996
3010
# still runs the rest of the examples
2997
3011
doc_suite = doctest.DocTestSuite(mod,
2998
3012
optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
3053
3067
This is the recommended public interface for test parameterization.
3054
3068
Typically the test_suite() method for a per-implementation test
3055
suite will call multiply_tests_from_modules and return the
3069
suite will call multiply_tests_from_modules and return the
3058
3072
:param module_name_list: List of fully-qualified names of test
3060
:param scenario_iter: Iterable of pairs of (scenario_name,
3074
:param scenario_iter: Iterable of pairs of (scenario_name,
3061
3075
scenario_param_dict).
3062
:param loader: If provided, will be used instead of a new
3076
:param loader: If provided, will be used instead of a new
3063
3077
bzrlib.tests.TestLoader() instance.
3065
3079
This returns a new TestSuite containing the cross product of
3066
3080
all the tests in all the modules, each repeated for each scenario.
3067
Each test is adapted by adding the scenario name at the end
3081
Each test is adapted by adding the scenario name at the end
3068
3082
of its name, and updating the test object's __dict__ with the
3069
3083
scenario_param_dict.
3071
3085
>>> r = multiply_tests_from_modules(
3072
3086
... ['bzrlib.tests.test_sampler'],
3073
... [('one', dict(param=1)),
3087
... [('one', dict(param=1)),
3074
3088
... ('two', dict(param=2))])
3075
3089
>>> tests = list(iter_suite_tests(r))