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
808
809
bzrlib.mutabletree.MutableTree: bzrlib.mutabletree.MutableTree.hooks,
809
810
bzrlib.smart.client._SmartClient: bzrlib.smart.client._SmartClient.hooks,
810
811
bzrlib.smart.server.SmartTCPServer: bzrlib.smart.server.SmartTCPServer.hooks,
812
bzrlib.commands.Command: bzrlib.commands.Command.hooks,
812
814
self.addCleanup(self._restoreHooks)
813
815
# reset all hooks to an empty instance of the appropriate type
814
816
bzrlib.branch.Branch.hooks = bzrlib.branch.BranchHooks()
815
817
bzrlib.smart.client._SmartClient.hooks = bzrlib.smart.client.SmartClientHooks()
816
818
bzrlib.smart.server.SmartTCPServer.hooks = bzrlib.smart.server.SmartServerHooks()
819
bzrlib.commands.Command.hooks = bzrlib.commands.CommandHooks()
818
821
def _silenceUI(self):
819
822
"""Turn off UI for duration of test"""
858
861
def assertEqualDiff(self, a, b, message=None):
859
862
"""Assert two texts are equal, if not raise an exception.
861
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
862
865
be hard to find the differences by eye.
864
867
# TODO: perhaps override assertEquals to call this for strings?
872
875
message = 'second string is missing a final newline.\n'
873
876
raise AssertionError(message +
874
877
self._ndiff_strings(a, b))
876
879
def assertEqualMode(self, mode, mode_test):
877
880
self.assertEqual(mode, mode_test,
878
881
'mode mismatch %o != %o' % (mode, mode_test))
937
940
def assertListRaises(self, excClass, func, *args, **kwargs):
938
941
"""Fail unless excClass is raised when the iterator from func is used.
940
943
Many functions can return generators this makes sure
941
944
to wrap them in a list() call to make sure the whole generator
942
945
is run, and that the proper exception is raised.
991
994
def assertTransportMode(self, transport, path, mode):
992
995
"""Fail if a path does not have mode mode.
994
997
If modes are not supported on this transport, the assertion is ignored.
996
999
if not transport._can_roundtrip_unix_modebits():
1167
1170
def callDeprecated(self, expected, callable, *args, **kwargs):
1168
1171
"""Assert that a callable is deprecated in a particular way.
1170
This is a very precise test for unusual requirements. The
1173
This is a very precise test for unusual requirements. The
1171
1174
applyDeprecated helper function is probably more suited for most tests
1172
1175
as it allows you to simply specify the deprecation format being used
1173
1176
and will ensure that that is issued for the function being called.
1218
1221
def addCleanup(self, callable, *args, **kwargs):
1219
1222
"""Arrange to run a callable when this case is torn down.
1221
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,
1222
1225
ie last-in first-out.
1224
1227
self._cleanups.append((callable, args, kwargs))
1308
1311
def time(self, callable, *args, **kwargs):
1309
1312
"""Run callable and accrue the time it takes to the benchmark time.
1311
1314
If lsprofiling is enabled (i.e. by --lsprof-time to bzr selftest) then
1312
1315
this will cause lsprofile statistics to be gathered and stored in
1313
1316
self._benchcalls.
1328
1331
self._benchtime += time.time() - start
1330
1333
def _runCleanups(self):
1331
"""Run registered cleanup functions.
1334
"""Run registered cleanup functions.
1333
1336
This should only be called from TestCase.tearDown.
1335
# TODO: Perhaps this should keep running cleanups even if
1338
# TODO: Perhaps this should keep running cleanups even if
1336
1339
# one of them fails?
1338
1341
# Actually pop the cleanups from the list so tearDown running
1454
1457
passed in three ways:
1456
1459
1- A list of strings, eg ["commit", "a"]. This is recommended
1457
when the command contains whitespace or metacharacters, or
1460
when the command contains whitespace or metacharacters, or
1458
1461
is built up at run time.
1460
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
1461
1464
for hardcoded commands.
1463
1466
This runs bzr through the interface that catches and reports
1522
1525
def run_bzr_subprocess(self, *args, **kwargs):
1523
1526
"""Run bzr in a subprocess for testing.
1525
This starts a new Python interpreter and runs bzr in there.
1528
This starts a new Python interpreter and runs bzr in there.
1526
1529
This should only be used for tests that have a justifiable need for
1527
1530
this isolation: e.g. they are testing startup time, or signal
1528
handling, or early startup code, etc. Subprocess code can't be
1531
handling, or early startup code, etc. Subprocess code can't be
1529
1532
profiled or debugged so easily.
1531
1534
:keyword retcode: The status code that is expected. Defaults to 0. If
1772
1775
def __init__(self, methodName='runTest'):
1773
1776
# allow test parameterization after test construction and before test
1774
# execution. Variables that the parameterizer sets need to be
1777
# execution. Variables that the parameterizer sets need to be
1775
1778
# ones that are not set by setUp, or setUp will trash them.
1776
1779
super(TestCaseWithMemoryTransport, self).__init__(methodName)
1777
1780
self.vfs_transport_factory = default_transport
1794
1797
def get_readonly_transport(self, relpath=None):
1795
1798
"""Return a readonly transport for the test scratch space
1797
1800
This can be used to test that operations which should only need
1798
1801
readonly access in fact do not try to write.
1830
1833
def get_readonly_url(self, relpath=None):
1831
1834
"""Get a URL for the readonly transport.
1833
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
1834
1837
used by self.get_url()
1835
1838
relpath provides for clients to get a path relative to the base url.
1836
1839
These should only be downwards relative, not upwards.
1970
1973
def makeAndChdirToTestDir(self):
1971
1974
"""Create a temporary directories for this one test.
1973
1976
This must set self.test_home_dir and self.test_dir and chdir to
1976
1979
For TestCaseWithMemoryTransport we chdir to the TEST_ROOT for this test.
1978
1981
os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
1979
1982
self.test_dir = TestCaseWithMemoryTransport.TEST_ROOT
1980
1983
self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
1982
1985
def make_branch(self, relpath, format=None):
1983
1986
"""Create a branch on the transport at relpath."""
1984
1987
repo = self.make_repository(relpath, format=format)
2003
2006
def make_repository(self, relpath, shared=False, format=None):
2004
2007
"""Create a repository on our default transport at relpath.
2006
2009
Note that relpath must be a relative path, not a full url.
2008
2011
# FIXME: If you create a remoterepository this returns the underlying
2009
# real format, which is incorrect. Actually we should make sure that
2012
# real format, which is incorrect. Actually we should make sure that
2010
2013
# RemoteBzrDir returns a RemoteRepository.
2011
2014
# maybe mbp 20070410
2012
2015
made_control = self.make_bzrdir(relpath, format=format)
2025
2028
def overrideEnvironmentForTesting(self):
2026
2029
os.environ['HOME'] = self.test_home_dir
2027
2030
os.environ['BZR_HOME'] = self.test_home_dir
2029
2032
def setUp(self):
2030
2033
super(TestCaseWithMemoryTransport, self).setUp()
2031
2034
self._make_test_root()
2039
2042
self.__server = None
2040
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 = []
2043
2059
class TestCaseInTempDir(TestCaseWithMemoryTransport):
2044
2060
"""Derived class that runs a test within a temporary directory.
2050
2066
All test cases create their own directory within that. If the
2051
2067
tests complete successfully, the directory is removed.
2053
: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
2054
2070
test, which contains a home directory and a work directory.
2056
2072
:ivar test_home_dir: An initially empty directory under test_base_dir
2083
2099
def makeAndChdirToTestDir(self):
2084
2100
"""See TestCaseWithMemoryTransport.makeAndChdirToTestDir().
2086
2102
For TestCaseInTempDir we create a temporary directory based on the test
2087
2103
name and then create two subdirs - test and home under it.
2187
2203
ReadonlyTransportDecorator is used instead which allows the use of non disk
2188
2204
based read write transports.
2190
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
2191
2207
readwrite one must both define get_url() as resolving to os.getcwd().
2305
2321
def condition_isinstance(klass_or_klass_list):
2306
2322
"""Create a condition filter which returns isinstance(param, klass).
2308
2324
:return: A callable which when called with one parameter obj return the
2309
2325
result of isinstance(obj, klass_or_klass_list).
2316
2332
def condition_id_in_list(id_list):
2317
2333
"""Create a condition filter which verify that test's id in a list.
2319
2335
:param id_list: A TestIdList object.
2320
2336
:return: A callable that returns True if the test's id appears in the list.
2327
2343
def condition_id_startswith(starts):
2328
2344
"""Create a condition filter verifying that test's id starts with a string.
2330
2346
:param starts: A list of string.
2331
: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
2332
2348
the given strings.
2334
2350
def condition(test):
2358
2374
def filter_suite_by_condition(suite, condition):
2359
2375
"""Create a test suite by filtering another one.
2361
2377
:param suite: The source suite.
2362
2378
:param condition: A callable whose result evaluates True when called with a
2363
2379
test case which should be included in the result.
2374
2390
def filter_suite_by_re(suite, pattern):
2375
2391
"""Create a test suite by filtering another one.
2377
2393
:param suite: the source suite
2378
2394
:param pattern: pattern that names must match
2379
2395
:returns: the newly created suite
2432
2448
def randomize_suite(suite):
2433
2449
"""Return a new TestSuite with suite's tests in random order.
2435
2451
The tests in the input suite are flattened into a single suite in order to
2436
2452
accomplish this. Any nested TestSuites are removed to provide global
2444
2460
def split_suite_by_condition(suite, condition):
2445
2461
"""Split a test suite into two by a condition.
2447
2463
:param suite: The suite to split.
2448
2464
:param condition: The condition to match on. Tests that match this
2449
2465
condition are returned in the first test suite, ones that do not match
2466
2482
def split_suite_by_re(suite, pattern):
2467
2483
"""Split a test suite into two by a regular expression.
2469
2485
:param suite: The suite to split.
2470
2486
:param pattern: A regular expression string. Test ids that match this
2471
2487
pattern will be in the first test suite returned, and the others in the
2485
2501
list_only=False,
2486
2502
random_seed=None,
2487
2503
exclude_pattern=None,
2506
"""Run a test suite for bzr selftest.
2508
:param runner_class: The class of runner to use. Must support the
2509
constructor arguments passed by run_suite which are more than standard
2511
:return: A boolean indicating success.
2489
2513
TestCase._gather_lsprof_in_benchmarks = lsprof_timed
2494
runner = TextTestRunner(stream=sys.stdout,
2518
if runner_class is None:
2519
runner_class = TextTestRunner
2520
runner = runner_class(stream=sys.stdout,
2495
2521
descriptions=0,
2496
2522
verbosity=verbosity,
2497
2523
bench_history=bench_history,
2588
2615
list_only=list_only,
2589
2616
random_seed=random_seed,
2590
2617
exclude_pattern=exclude_pattern,
2619
runner_class=runner_class,
2593
2622
default_transport = old_transport
2594
2623
selftest_debug_flags = old_debug_flags
2621
2650
"""Warns about tests not appearing or appearing more than once.
2623
2652
:param test_suite: A TestSuite object.
2624
: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
2627
2656
:return: (absents, duplicates) absents is a list containing the test found
2874
2903
'bzrlib.tests.test_shelf_ui',
2875
2904
'bzrlib.tests.test_smart',
2876
2905
'bzrlib.tests.test_smart_add',
2906
'bzrlib.tests.test_smart_request',
2877
2907
'bzrlib.tests.test_smart_transport',
2878
2908
'bzrlib.tests.test_smtp_connection',
2879
2909
'bzrlib.tests.test_source',
2975
3005
# No tests to keep here, move along
2978
# note that this really does mean "report only" -- doctest
3008
# note that this really does mean "report only" -- doctest
2979
3009
# still runs the rest of the examples
2980
3010
doc_suite = doctest.DocTestSuite(mod,
2981
3011
optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
3036
3066
This is the recommended public interface for test parameterization.
3037
3067
Typically the test_suite() method for a per-implementation test
3038
suite will call multiply_tests_from_modules and return the
3068
suite will call multiply_tests_from_modules and return the
3041
3071
:param module_name_list: List of fully-qualified names of test
3043
:param scenario_iter: Iterable of pairs of (scenario_name,
3073
:param scenario_iter: Iterable of pairs of (scenario_name,
3044
3074
scenario_param_dict).
3045
:param loader: If provided, will be used instead of a new
3075
:param loader: If provided, will be used instead of a new
3046
3076
bzrlib.tests.TestLoader() instance.
3048
3078
This returns a new TestSuite containing the cross product of
3049
3079
all the tests in all the modules, each repeated for each scenario.
3050
Each test is adapted by adding the scenario name at the end
3080
Each test is adapted by adding the scenario name at the end
3051
3081
of its name, and updating the test object's __dict__ with the
3052
3082
scenario_param_dict.
3054
3084
>>> r = multiply_tests_from_modules(
3055
3085
... ['bzrlib.tests.test_sampler'],
3056
... [('one', dict(param=1)),
3086
... [('one', dict(param=1)),
3057
3087
... ('two', dict(param=2))])
3058
3088
>>> tests = list(iter_suite_tests(r))