211
219
osutils.set_or_unset_env(var, value)
222
def _clear__type_equality_funcs(test):
223
"""Cleanup bound methods stored on TestCase instances
225
Clear the dict breaking a few (mostly) harmless cycles in the affected
226
unittests released with Python 2.6 and initial Python 2.7 versions.
228
For a few revisions between Python 2.7.1 and Python 2.7.2 that annoyingly
229
shipped in Oneiric, an object with no clear method was used, hence the
230
extra complications, see bug 809048 for details.
232
type_equality_funcs = getattr(test, "_type_equality_funcs", None)
233
if type_equality_funcs is not None:
234
tef_clear = getattr(type_equality_funcs, "clear", None)
235
if tef_clear is None:
236
tef_instance_dict = getattr(type_equality_funcs, "__dict__", None)
237
if tef_instance_dict is not None:
238
tef_clear = tef_instance_dict.clear
239
if tef_clear is not None:
214
243
class ExtendedTestResult(testtools.TextTestResult):
215
244
"""Accepts, reports and accumulates the results of running tests.
331
360
return float(''.join(details['benchtime'].iter_bytes()))
332
361
return getattr(testCase, "_benchtime", None)
363
def _delta_to_float(self, a_timedelta, precision):
364
# This calls ceiling to ensure that the most pessimistic view of time
365
# taken is shown (rather than leaving it to the Python %f operator
366
# to decide whether to round/floor/ceiling. This was added when we
367
# had pyp3 test failures that suggest a floor was happening.
368
shift = 10 ** precision
369
return math.ceil((a_timedelta.days * 86400.0 + a_timedelta.seconds +
370
a_timedelta.microseconds / 1000000.0) * shift) / shift
334
372
def _elapsedTestTimeString(self):
335
373
"""Return a time string for the overall time the current test has taken."""
336
374
return self._formatTime(self._delta_to_float(
337
self._now() - self._start_datetime))
375
self._now() - self._start_datetime, 3))
339
377
def _testTimeString(self, testCase):
340
378
benchmark_time = self._extractBenchmarkTime(testCase)
384
422
getDetails = getattr(test, "getDetails", None)
385
423
if getDetails is not None:
386
424
getDetails().clear()
387
# Clear _type_equality_funcs to try to stop TestCase instances
388
# from wasting memory. 'clear' is not available in all Python
389
# versions (bug 809048)
390
type_equality_funcs = getattr(test, "_type_equality_funcs", None)
391
if type_equality_funcs is not None:
392
tef_clear = getattr(type_equality_funcs, "clear", None)
393
if tef_clear is None:
394
tef_instance_dict = getattr(type_equality_funcs, "__dict__", None)
395
if tef_instance_dict is not None:
396
tef_clear = tef_instance_dict.clear
397
if tef_clear is not None:
425
_clear__type_equality_funcs(test)
399
426
self._traceback_from_test = None
401
428
def startTests(self):
502
529
self.not_applicable_count += 1
503
530
self.report_not_applicable(test, reason)
532
def _count_stored_tests(self):
533
"""Count of tests instances kept alive due to not succeeding"""
534
return self.error_count + self.failure_count + self.known_failure_count
505
536
def _post_mortem(self, tb=None):
506
537
"""Start a PDB post mortem session."""
507
538
if os.environ.get('BZR_TEST_PDB', None):
980
1011
def setUp(self):
981
1012
super(TestCase, self).setUp()
1014
# At this point we're still accessing the config files in $BZR_HOME (as
1015
# set by the user running selftest).
1016
timeout = config.GlobalStack().get('selftest.timeout')
1018
timeout_fixture = fixtures.TimeoutFixture(timeout)
1019
timeout_fixture.setUp()
1020
self.addCleanup(timeout_fixture.cleanUp)
982
1022
for feature in getattr(self, '_test_needs_features', []):
983
1023
self.requireFeature(feature)
984
1024
self._cleanEnvironment()
1026
if bzrlib.global_state is not None:
1027
self.overrideAttr(bzrlib.global_state, 'cmdline_overrides',
1028
config.CommandLineStore())
985
1030
self._silenceUI()
986
1031
self._startLogFile()
987
1032
self._benchcalls = []
994
1039
# between tests. We should get rid of this altogether: bug 656694. --
996
1041
self.overrideAttr(bzrlib.trace, '_verbosity_level', 0)
997
# Isolate config option expansion until its default value for bzrlib is
998
# settled on or a the FIXME associated with _get_expand_default_value
999
# is addressed -- vila 20110219
1000
self.overrideAttr(config, '_expand_default_value', None)
1001
1042
self._log_files = set()
1002
1043
# Each key in the ``_counters`` dict holds a value for a different
1003
1044
# counter. When the test ends, addDetail() should be used to output the
1005
1046
self._counters = {}
1006
1047
if 'config_stats' in selftest_debug_flags:
1007
1048
self._install_config_stats_hooks()
1049
# Do not use i18n for tests (unless the test reverses this)
1009
1052
def debug(self):
1010
1053
# debug a frame up.
1012
pdb.Pdb().set_trace(sys._getframe().f_back)
1055
# The sys preserved stdin/stdout should allow blackbox tests debugging
1056
pdb.Pdb(stdin=sys.__stdin__, stdout=sys.__stdout__
1057
).set_trace(sys._getframe().f_back)
1014
1059
def discardDetail(self, name):
1015
1060
"""Extend the addDetail, getDetails api so we can remove a detail.
1292
1337
# hook into bzr dir opening. This leaves a small window of error for
1293
1338
# transport tests, but they are well known, and we can improve on this
1295
bzrdir.BzrDir.hooks.install_named_hook("pre_open",
1340
controldir.ControlDir.hooks.install_named_hook("pre_open",
1296
1341
self._preopen_isolate_transport, "Check bzr directories are safe.")
1298
1343
def _ndiff_strings(self, a, b):
1712
1756
self.addCleanup(self._finishLogFile)
1714
1758
def _finishLogFile(self):
1715
"""Finished with the log file.
1717
Close the file and delete it.
1759
"""Flush and dereference the in-memory log for this testcase"""
1719
1760
if trace._trace_file:
1720
1761
# flush the log file, to get all content
1721
1762
trace._trace_file.flush()
1722
1763
trace.pop_log_file(self._log_memento)
1764
# The logging module now tracks references for cleanup so discard ours
1765
del self._log_memento
1724
1767
def thisFailsStrictLockCheck(self):
1725
1768
"""It is known that this test would fail with -Dstrict_locks.
1750
1793
:returns: The actual attr value.
1752
value = getattr(obj, attr_name)
1753
1795
# The actual value is captured by the call below
1754
self.addCleanup(setattr, obj, attr_name, value)
1796
value = getattr(obj, attr_name, _unitialized_attr)
1797
if value is _unitialized_attr:
1798
# When the test completes, the attribute should not exist, but if
1799
# we aren't setting a value, we don't need to do anything.
1800
if new is not _unitialized_attr:
1801
self.addCleanup(delattr, obj, attr_name)
1803
self.addCleanup(setattr, obj, attr_name, value)
1755
1804
if new is not _unitialized_attr:
1756
1805
setattr(obj, attr_name, new)
1961
2010
self.log('run bzr: %r', args)
1962
2011
# FIXME: don't call into logging here
1963
handler = logging.StreamHandler(stderr)
1964
handler.setLevel(logging.INFO)
2012
handler = trace.EncodedStreamHandler(stderr, errors="replace",
1965
2014
logger = logging.getLogger('')
1966
2015
logger.addHandler(handler)
1967
2016
old_ui_factory = ui.ui_factory
2351
2405
from bzrlib.smart import request
2352
2406
request_handlers = request.request_handlers
2353
2407
orig_method = request_handlers.get(verb)
2408
orig_info = request_handlers.get_info(verb)
2354
2409
request_handlers.remove(verb)
2355
self.addCleanup(request_handlers.register, verb, orig_method)
2410
self.addCleanup(request_handlers.register, verb, orig_method,
2358
2414
class CapturedCall(object):
2411
2467
self.transport_readonly_server = None
2412
2468
self.__vfs_server = None
2471
super(TestCaseWithMemoryTransport, self).setUp()
2473
def _add_disconnect_cleanup(transport):
2474
"""Schedule disconnection of given transport at test cleanup
2476
This needs to happen for all connected transports or leaks occur.
2478
Note reconnections may mean we call disconnect multiple times per
2479
transport which is suboptimal but seems harmless.
2481
self.addCleanup(transport.disconnect)
2483
_mod_transport.Transport.hooks.install_named_hook('post_connect',
2484
_add_disconnect_cleanup, None)
2486
self._make_test_root()
2487
self.addCleanup(os.chdir, os.getcwdu())
2488
self.makeAndChdirToTestDir()
2489
self.overrideEnvironmentForTesting()
2490
self.__readonly_server = None
2491
self.__server = None
2492
self.reduceLockdirTimeout()
2493
# Each test may use its own config files even if the local config files
2494
# don't actually exist. They'll rightly fail if they try to create them
2496
self.overrideAttr(config, '_shared_stores', {})
2414
2498
def get_transport(self, relpath=None):
2415
2499
"""Return a writeable transport.
2560
2645
root = TestCaseWithMemoryTransport.TEST_ROOT
2561
wt = bzrdir.BzrDir.create_standalone_workingtree(root)
2647
# Make sure we get a readable and accessible home for .bzr.log
2648
# and/or config files, and not fallback to weird defaults (see
2649
# http://pad.lv/825027).
2650
self.assertIs(None, os.environ.get('BZR_HOME', None))
2651
os.environ['BZR_HOME'] = root
2652
wt = controldir.ControlDir.create_standalone_workingtree(root)
2653
del os.environ['BZR_HOME']
2654
except Exception, e:
2655
self.fail("Fail to initialize the safety net: %r\n" % (e,))
2562
2656
# Hack for speed: remember the raw bytes of the dirstate file so that
2563
2657
# we don't need to re-open the wt to check it hasn't changed.
2564
2658
TestCaseWithMemoryTransport._SAFETY_NET_PRISTINE_DIRSTATE = (
2612
2706
self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
2613
2707
self.permit_dir(self.test_dir)
2615
def make_branch(self, relpath, format=None):
2709
def make_branch(self, relpath, format=None, name=None):
2616
2710
"""Create a branch on the transport at relpath."""
2617
2711
repo = self.make_repository(relpath, format=format)
2618
return repo.bzrdir.create_branch()
2712
return repo.bzrdir.create_branch(append_revisions_only=False,
2715
def get_default_format(self):
2718
def resolve_format(self, format):
2719
"""Resolve an object to a ControlDir format object.
2721
The initial format object can either already be
2722
a ControlDirFormat, None (for the default format),
2723
or a string with the name of the control dir format.
2725
:param format: Object to resolve
2726
:return A ControlDirFormat instance
2729
format = self.get_default_format()
2730
if isinstance(format, basestring):
2731
format = controldir.format_registry.make_bzrdir(format)
2620
2734
def make_bzrdir(self, relpath, format=None):
2625
2739
t = _mod_transport.get_transport(maybe_a_url)
2626
2740
if len(segments) > 1 and segments[-1] not in ('', '.'):
2627
2741
t.ensure_base()
2630
if isinstance(format, basestring):
2631
format = bzrdir.format_registry.make_bzrdir(format)
2742
format = self.resolve_format(format)
2632
2743
return format.initialize_on_transport(t)
2633
2744
except errors.UninitializableFormat:
2634
2745
raise TestSkipped("Format %s is not initializable." % format)
2636
def make_repository(self, relpath, shared=False, format=None):
2747
def make_repository(self, relpath, shared=None, format=None):
2637
2748
"""Create a repository on our default transport at relpath.
2639
2750
Note that relpath must be a relative path, not a full url.
2670
2781
self.overrideEnv('HOME', test_home_dir)
2671
2782
self.overrideEnv('BZR_HOME', test_home_dir)
2674
super(TestCaseWithMemoryTransport, self).setUp()
2675
# Ensure that ConnectedTransport doesn't leak sockets
2676
def get_transport_from_url_with_cleanup(*args, **kwargs):
2677
t = orig_get_transport_from_url(*args, **kwargs)
2678
if isinstance(t, _mod_transport.ConnectedTransport):
2679
self.addCleanup(t.disconnect)
2682
orig_get_transport_from_url = self.overrideAttr(
2683
_mod_transport, 'get_transport_from_url',
2684
get_transport_from_url_with_cleanup)
2685
self._make_test_root()
2686
self.addCleanup(os.chdir, os.getcwdu())
2687
self.makeAndChdirToTestDir()
2688
self.overrideEnvironmentForTesting()
2689
self.__readonly_server = None
2690
self.__server = None
2691
self.reduceLockdirTimeout()
2693
2784
def setup_smart_server_with_call_log(self):
2694
2785
"""Sets up a smart server as the transport server with a call log."""
2695
2786
self.transport_server = test_server.SmartTCPServer_for_testing
2787
self.hpss_connections = []
2696
2788
self.hpss_calls = []
2697
2789
import traceback
2698
2790
# Skip the current stack down to the caller of
2701
2793
def capture_hpss_call(params):
2702
2794
self.hpss_calls.append(
2703
2795
CapturedCall(params, prefix_length))
2796
def capture_connect(transport):
2797
self.hpss_connections.append(transport)
2704
2798
client._SmartClient.hooks.install_named_hook(
2705
2799
'call', capture_hpss_call, None)
2800
_mod_transport.Transport.hooks.install_named_hook(
2801
'post_connect', capture_connect, None)
2707
2803
def reset_smart_call_log(self):
2708
2804
self.hpss_calls = []
2805
self.hpss_connections = []
2711
2808
class TestCaseInTempDir(TestCaseWithMemoryTransport):
2781
2878
# stacking policy to honour; create a bzr dir with an unshared
2782
2879
# repository (but not a branch - our code would be trying to escape
2783
2880
# then!) to stop them, and permit it to be read.
2784
# control = bzrdir.BzrDir.create(self.test_base_dir)
2881
# control = controldir.ControlDir.create(self.test_base_dir)
2785
2882
# control.create_repository()
2786
2883
self.test_home_dir = self.test_base_dir + '/home'
2787
2884
os.mkdir(self.test_home_dir)
2822
2919
"a list or a tuple. Got %r instead" % (shape,))
2823
2920
# It's OK to just create them using forward slashes on windows.
2824
2921
if transport is None or transport.is_readonly():
2825
transport = _mod_transport.get_transport(".")
2922
transport = _mod_transport.get_transport_from_path(".")
2826
2923
for name in shape:
2827
2924
self.assertIsInstance(name, basestring)
2828
2925
if name[-1] == '/':
2913
3014
# this obviously requires a format that supports branch references
2914
3015
# so check for that by checking bzrdir.BzrDirFormat.get_default_format()
3017
format = self.resolve_format(format=format)
3018
if not format.supports_workingtrees:
3019
b = self.make_branch(relpath+'.branch', format=format)
3020
return b.create_checkout(relpath, lightweight=True)
2916
3021
b = self.make_branch(relpath, format=format)
2918
3023
return b.bzrdir.create_workingtree()
2923
3028
if self.vfs_transport_factory is test_server.LocalURLServer:
2924
3029
# the branch is colocated on disk, we cannot create a checkout.
2925
3030
# hopefully callers will expect this.
2926
local_controldir= bzrdir.BzrDir.open(self.get_vfs_only_url(relpath))
3031
local_controldir = controldir.ControlDir.open(
3032
self.get_vfs_only_url(relpath))
2927
3033
wt = local_controldir.create_workingtree()
2928
3034
if wt.branch._format != b._format:
2959
3065
self.assertFalse(differences.has_changed(),
2960
3066
"Trees %r and %r are different: %r" % (left, right, differences))
2963
super(TestCaseWithTransport, self).setUp()
2964
self.__vfs_server = None
2966
3068
def disable_missing_extensions_warning(self):
2967
3069
"""Some tests expect a precise stderr content.
2969
3071
There is no point in forcing them to duplicate the extension related
2972
config.GlobalConfig().set_user_option('ignore_missing_extensions', True)
3074
config.GlobalStack().set('ignore_missing_extensions', True)
2975
3077
class ChrootedTestCase(TestCaseWithTransport):
3217
3319
result_decorators=result_decorators,
3219
3321
runner.stop_on_failure=stop_on_failure
3322
if isinstance(suite, unittest.TestSuite):
3323
# Empty out _tests list of passed suite and populate new TestSuite
3324
suite._tests[:], suite = [], TestSuite(suite)
3220
3325
# built in decorator factories:
3222
3327
random_order(random_seed, runner),
3321
3426
class TestDecorator(TestUtil.TestSuite):
3322
3427
"""A decorator for TestCase/TestSuite objects.
3324
Usually, subclasses should override __iter__(used when flattening test
3325
suites), which we do to filter, reorder, parallelise and so on, run() and
3429
Contains rather than flattening suite passed on construction
3329
def __init__(self, suite):
3330
TestUtil.TestSuite.__init__(self)
3333
def countTestCases(self):
3336
cases += test.countTestCases()
3343
def run(self, result):
3344
# Use iteration on self, not self._tests, to allow subclasses to hook
3347
if result.shouldStop:
3432
def __init__(self, suite=None):
3433
super(TestDecorator, self).__init__()
3434
if suite is not None:
3437
# Don't need subclass run method with suite emptying
3438
run = unittest.TestSuite.run
3353
3441
class CountingDecorator(TestDecorator):
3364
3452
"""A decorator which excludes test matching an exclude pattern."""
3366
3454
def __init__(self, suite, exclude_pattern):
3367
TestDecorator.__init__(self, suite)
3368
self.exclude_pattern = exclude_pattern
3369
self.excluded = False
3373
return iter(self._tests)
3374
self.excluded = True
3375
suite = exclude_tests_by_re(self, self.exclude_pattern)
3377
self.addTests(suite)
3378
return iter(self._tests)
3455
super(ExcludeDecorator, self).__init__(
3456
exclude_tests_by_re(suite, exclude_pattern))
3381
3459
class FilterTestsDecorator(TestDecorator):
3382
3460
"""A decorator which filters tests to those matching a pattern."""
3384
3462
def __init__(self, suite, pattern):
3385
TestDecorator.__init__(self, suite)
3386
self.pattern = pattern
3387
self.filtered = False
3391
return iter(self._tests)
3392
self.filtered = True
3393
suite = filter_suite_by_re(self, self.pattern)
3395
self.addTests(suite)
3396
return iter(self._tests)
3463
super(FilterTestsDecorator, self).__init__(
3464
filter_suite_by_re(suite, pattern))
3399
3467
class RandomDecorator(TestDecorator):
3400
3468
"""A decorator which randomises the order of its tests."""
3402
3470
def __init__(self, suite, random_seed, stream):
3403
TestDecorator.__init__(self, suite)
3404
self.random_seed = random_seed
3405
self.randomised = False
3406
self.stream = stream
3410
return iter(self._tests)
3411
self.randomised = True
3412
self.stream.write("Randomizing test order using seed %s\n\n" %
3413
(self.actual_seed()))
3471
random_seed = self.actual_seed(random_seed)
3472
stream.write("Randomizing test order using seed %s\n\n" %
3414
3474
# Initialise the random number generator.
3415
random.seed(self.actual_seed())
3416
suite = randomize_suite(self)
3418
self.addTests(suite)
3419
return iter(self._tests)
3475
random.seed(random_seed)
3476
super(RandomDecorator, self).__init__(randomize_suite(suite))
3421
def actual_seed(self):
3422
if self.random_seed == "now":
3479
def actual_seed(seed):
3423
3481
# We convert the seed to a long to make it reuseable across
3424
3482
# invocations (because the user can reenter it).
3425
self.random_seed = long(time.time())
3483
return long(time.time())
3427
3485
# Convert the seed to a long if we can
3429
self.random_seed = long(self.random_seed)
3488
except (TypeError, ValueError):
3432
return self.random_seed
3435
3493
class TestFirstDecorator(TestDecorator):
3436
3494
"""A decorator which moves named tests to the front."""
3438
3496
def __init__(self, suite, pattern):
3439
TestDecorator.__init__(self, suite)
3440
self.pattern = pattern
3441
self.filtered = False
3445
return iter(self._tests)
3446
self.filtered = True
3447
suites = split_suite_by_re(self, self.pattern)
3449
self.addTests(suites)
3450
return iter(self._tests)
3497
super(TestFirstDecorator, self).__init__()
3498
self.addTests(split_suite_by_re(suite, pattern))
3453
3501
def partition_tests(suite, count):
3498
3546
ProtocolTestCase.run(self, result)
3500
os.waitpid(self.pid, 0)
3548
pid, status = os.waitpid(self.pid, 0)
3549
# GZ 2011-10-18: If status is nonzero, should report to the result
3550
# that something went wrong.
3502
3552
test_blocks = partition_tests(suite, concurrency)
3553
# Clear the tests from the original suite so it doesn't keep them alive
3554
suite._tests[:] = []
3503
3555
for process_tests in test_blocks:
3504
process_suite = TestUtil.TestSuite()
3505
process_suite.addTests(process_tests)
3556
process_suite = TestUtil.TestSuite(process_tests)
3557
# Also clear each split list so new suite has only reference
3558
process_tests[:] = []
3506
3559
c2pread, c2pwrite = os.pipe()
3507
3560
pid = os.fork()
3509
workaround_zealous_crypto_random()
3563
stream = os.fdopen(c2pwrite, 'wb', 1)
3564
workaround_zealous_crypto_random()
3511
3565
os.close(c2pread)
3512
3566
# Leave stderr and stdout open so we can see test noise
3513
3567
# Close stdin so that the child goes away if it decides to
3514
3568
# read from stdin (otherwise its a roulette to see what
3515
3569
# child actually gets keystrokes for pdb etc).
3516
3570
sys.stdin.close()
3518
stream = os.fdopen(c2pwrite, 'wb', 1)
3519
3571
subunit_result = AutoTimingTestResultDecorator(
3520
TestProtocolClient(stream))
3572
SubUnitBzrProtocolClient(stream))
3521
3573
process_suite.run(subunit_result)
3575
# Try and report traceback on stream, but exit with error even
3576
# if stream couldn't be created or something else goes wrong.
3577
# The traceback is formatted to a string and written in one go
3578
# to avoid interleaving lines from multiple failing children.
3580
stream.write(traceback.format_exc())
3525
3585
os.close(c2pwrite)
3526
3586
stream = os.fdopen(c2pread, 'rb', 1)
3632
3692
# with proper exclusion rules.
3633
3693
# -Ethreads Will display thread ident at creation/join time to
3634
3694
# help track thread leaks
3695
# -Euncollected_cases Display the identity of any test cases that weren't
3696
# deallocated after being completed.
3636
3697
# -Econfig_stats Will collect statistics using addDetail
3637
3698
selftest_debug_flags = set()
3744
3805
:return: (absents, duplicates) absents is a list containing the test found
3745
3806
in id_list but not in test_suite, duplicates is a list containing the
3746
test found multiple times in test_suite.
3807
tests found multiple times in test_suite.
3748
3809
When using a prefined test id list, it may occurs that some tests do not
3749
3810
exist anymore or that some tests use the same id. This function warns the
3943
4003
'bzrlib.tests.test_email_message',
3944
4004
'bzrlib.tests.test_eol_filters',
3945
4005
'bzrlib.tests.test_errors',
4006
'bzrlib.tests.test_estimate_compressed_size',
3946
4007
'bzrlib.tests.test_export',
3947
4008
'bzrlib.tests.test_export_pot',
3948
4009
'bzrlib.tests.test_extract',
3966
4027
'bzrlib.tests.test_http',
3967
4028
'bzrlib.tests.test_http_response',
3968
4029
'bzrlib.tests.test_https_ca_bundle',
4030
'bzrlib.tests.test_https_urllib',
3969
4031
'bzrlib.tests.test_i18n',
3970
4032
'bzrlib.tests.test_identitymap',
3971
4033
'bzrlib.tests.test_ignores',
4020
4082
'bzrlib.tests.test_revisiontree',
4021
4083
'bzrlib.tests.test_rio',
4022
4084
'bzrlib.tests.test_rules',
4085
'bzrlib.tests.test_url_policy_open',
4023
4086
'bzrlib.tests.test_sampler',
4024
4087
'bzrlib.tests.test_scenarios',
4025
4088
'bzrlib.tests.test_script',
4032
4095
'bzrlib.tests.test_smart',
4033
4096
'bzrlib.tests.test_smart_add',
4034
4097
'bzrlib.tests.test_smart_request',
4098
'bzrlib.tests.test_smart_signals',
4035
4099
'bzrlib.tests.test_smart_transport',
4036
4100
'bzrlib.tests.test_smtp_connection',
4037
4101
'bzrlib.tests.test_source',
4068
4132
'bzrlib.tests.test_version',
4069
4133
'bzrlib.tests.test_version_info',
4070
4134
'bzrlib.tests.test_versionedfile',
4135
'bzrlib.tests.test_vf_search',
4071
4136
'bzrlib.tests.test_weave',
4072
4137
'bzrlib.tests.test_whitebox',
4073
4138
'bzrlib.tests.test_win32utils',
4434
4499
from subunit.test_results import AutoTimingTestResultDecorator
4435
4500
class SubUnitBzrProtocolClient(TestProtocolClient):
4502
def stopTest(self, test):
4503
super(SubUnitBzrProtocolClient, self).stopTest(test)
4504
_clear__type_equality_funcs(test)
4437
4506
def addSuccess(self, test, details=None):
4438
4507
# The subunit client always includes the details in the subunit
4439
4508
# stream, but we don't want to include it in ours.
4455
@deprecated_function(deprecated_in((2, 5, 0)))
4456
def ModuleAvailableFeature(name):
4457
from bzrlib.tests import features
4458
return features.ModuleAvailableFeature(name)
4524
# API compatibility for old plugins; see bug 892622.
4527
'HTTPServerFeature',
4528
'ModuleAvailableFeature',
4529
'HTTPSServerFeature', 'SymlinkFeature', 'HardlinkFeature',
4530
'OsFifoFeature', 'UnicodeFilenameFeature',
4531
'ByteStringNamedFilesystem', 'UTF8Filesystem',
4532
'BreakinFeature', 'CaseInsCasePresFilenameFeature',
4533
'CaseInsensitiveFilesystemFeature', 'case_sensitive_filesystem_feature',
4534
'posix_permissions_feature',
4536
globals()[name] = _CompatabilityThunkFeature(
4537
symbol_versioning.deprecated_in((2, 5, 0)),
4538
'bzrlib.tests', name,
4539
name, 'bzrlib.tests.features')
4542
for (old_name, new_name) in [
4543
('UnicodeFilename', 'UnicodeFilenameFeature'),
4545
globals()[name] = _CompatabilityThunkFeature(
4546
symbol_versioning.deprecated_in((2, 5, 0)),
4547
'bzrlib.tests', old_name,
4548
new_name, 'bzrlib.tests.features')