1507
1723
:returns: The actual attr value.
1509
value = getattr(obj, attr_name)
1510
1725
# The actual value is captured by the call below
1511
self.addCleanup(setattr, obj, attr_name, value)
1726
value = getattr(obj, attr_name, _unitialized_attr)
1727
if value is _unitialized_attr:
1728
# When the test completes, the attribute should not exist, but if
1729
# we aren't setting a value, we don't need to do anything.
1730
if new is not _unitialized_attr:
1731
self.addCleanup(delattr, obj, attr_name)
1733
self.addCleanup(setattr, obj, attr_name, value)
1512
1734
if new is not _unitialized_attr:
1513
1735
setattr(obj, attr_name, new)
1738
def overrideEnv(self, name, new):
1739
"""Set an environment variable, and reset it after the test.
1741
:param name: The environment variable name.
1743
:param new: The value to set the variable to. If None, the
1744
variable is deleted from the environment.
1746
:returns: The actual variable value.
1748
value = osutils.set_or_unset_env(name, new)
1749
self.addCleanup(osutils.set_or_unset_env, name, value)
1752
def recordCalls(self, obj, attr_name):
1753
"""Monkeypatch in a wrapper that will record calls.
1755
The monkeypatch is automatically removed when the test concludes.
1757
:param obj: The namespace holding the reference to be replaced;
1758
typically a module, class, or object.
1759
:param attr_name: A string for the name of the attribute to
1761
:returns: A list that will be extended with one item every time the
1762
function is called, with a tuple of (args, kwargs).
1766
def decorator(*args, **kwargs):
1767
calls.append((args, kwargs))
1768
return orig(*args, **kwargs)
1769
orig = self.overrideAttr(obj, attr_name, decorator)
1516
1772
def _cleanEnvironment(self):
1518
'BZR_HOME': None, # Don't inherit BZR_HOME to all the tests.
1519
'HOME': os.getcwd(),
1520
# bzr now uses the Win32 API and doesn't rely on APPDATA, but the
1521
# tests do check our impls match APPDATA
1522
'BZR_EDITOR': None, # test_msgeditor manipulates this variable
1526
'BZREMAIL': None, # may still be present in the environment
1528
'BZR_PROGRESS_BAR': None,
1530
'BZR_PLUGIN_PATH': None,
1531
'BZR_DISABLE_PLUGINS': None,
1532
'BZR_PLUGINS_AT': None,
1533
'BZR_CONCURRENCY': None,
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.
1541
'BZR_COLUMNS': '80',
1543
'SSH_AUTH_SOCK': None,
1547
'https_proxy': None,
1548
'HTTPS_PROXY': None,
1553
# Nobody cares about ftp_proxy, FTP_PROXY AFAIK. So far at
1554
# least. If you do (care), please update this comment
1558
'BZR_REMOTE_PATH': None,
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',
1566
self.addCleanup(self._restoreEnvironment)
1567
for name, value in new_env.iteritems():
1568
self._captureVar(name, value)
1570
def _captureVar(self, name, newvalue):
1571
"""Set an environment variable, and reset it when finished."""
1572
self._old_env[name] = osutils.set_or_unset_env(name, newvalue)
1574
def _restoreEnvironment(self):
1575
for name, value in self._old_env.iteritems():
1576
osutils.set_or_unset_env(name, value)
1773
for name, value in isolated_environ.items():
1774
self.overrideEnv(name, value)
1578
1776
def _restoreHooks(self):
1579
1777
for klass, (name, hooks) in self._preserved_hooks.items():
1580
1778
setattr(klass, name, hooks)
1779
self._preserved_hooks.clear()
1780
breezy.hooks._lazy_hooks = self._preserved_lazy_hooks
1781
self._preserved_lazy_hooks.clear()
1582
1783
def knownFailure(self, reason):
1583
"""This test has failed for some known reason."""
1584
raise KnownFailure(reason)
1784
"""Declare that this test fails for a known reason
1786
Tests that are known to fail should generally be using expectedFailure
1787
with an appropriate reverse assertion if a change could cause the test
1788
to start passing. Conversely if the test has no immediate prospect of
1789
succeeding then using skip is more suitable.
1791
When this method is called while an exception is being handled, that
1792
traceback will be used, otherwise a new exception will be thrown to
1793
provide one but won't be reported.
1795
self._add_reason(reason)
1797
exc_info = sys.exc_info()
1798
if exc_info != (None, None, None):
1799
self._report_traceback(exc_info)
1802
raise self.failureException(reason)
1803
except self.failureException:
1804
exc_info = sys.exc_info()
1805
# GZ 02-08-2011: Maybe cleanup this err.exc_info attribute too?
1806
raise testtools.testcase._ExpectedFailure(exc_info)
1810
def _suppress_log(self):
1811
"""Remove the log info from details."""
1812
self.discardDetail('log')
1586
1814
def _do_skip(self, result, reason):
1815
self._suppress_log()
1587
1816
addSkip = getattr(result, 'addSkip', None)
1588
1817
if not callable(addSkip):
1589
1818
result.addSuccess(result)
3616
3838
# This alias allows to detect typos ('bzrlin.') by making all valid test ids
3617
# appear prefixed ('bzrlib.' is "replaced" by 'bzrlib.').
3618
test_prefix_alias_registry.register('bzrlib', 'bzrlib')
3839
# appear prefixed ('breezy.' is "replaced" by 'breezy.').
3840
test_prefix_alias_registry.register('breezy', 'breezy')
3620
3842
# Obvious highest levels prefixes, feel free to add your own via a plugin
3621
test_prefix_alias_registry.register('bd', 'bzrlib.doc')
3622
test_prefix_alias_registry.register('bu', 'bzrlib.utils')
3623
test_prefix_alias_registry.register('bt', 'bzrlib.tests')
3624
test_prefix_alias_registry.register('bb', 'bzrlib.tests.blackbox')
3625
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
3843
test_prefix_alias_registry.register('bd', 'breezy.doc')
3844
test_prefix_alias_registry.register('bu', 'breezy.utils')
3845
test_prefix_alias_registry.register('bt', 'breezy.tests')
3846
test_prefix_alias_registry.register('bb', 'breezy.tests.blackbox')
3847
test_prefix_alias_registry.register('bp', 'breezy.plugins')
3628
3850
def _test_suite_testmod_names():
3629
3851
"""Return the standard list of test module names to test."""
3632
'bzrlib.tests.blackbox',
3633
'bzrlib.tests.commands',
3634
'bzrlib.tests.per_branch',
3635
'bzrlib.tests.per_bzrdir',
3636
'bzrlib.tests.per_bzrdir_colo',
3637
'bzrlib.tests.per_foreign_vcs',
3638
'bzrlib.tests.per_interrepository',
3639
'bzrlib.tests.per_intertree',
3640
'bzrlib.tests.per_inventory',
3641
'bzrlib.tests.per_interbranch',
3642
'bzrlib.tests.per_lock',
3643
'bzrlib.tests.per_merger',
3644
'bzrlib.tests.per_transport',
3645
'bzrlib.tests.per_tree',
3646
'bzrlib.tests.per_pack_repository',
3647
'bzrlib.tests.per_repository',
3648
'bzrlib.tests.per_repository_chk',
3649
'bzrlib.tests.per_repository_reference',
3650
'bzrlib.tests.per_uifactory',
3651
'bzrlib.tests.per_versionedfile',
3652
'bzrlib.tests.per_workingtree',
3653
'bzrlib.tests.test__annotator',
3654
'bzrlib.tests.test__bencode',
3655
'bzrlib.tests.test__chk_map',
3656
'bzrlib.tests.test__dirstate_helpers',
3657
'bzrlib.tests.test__groupcompress',
3658
'bzrlib.tests.test__known_graph',
3659
'bzrlib.tests.test__rio',
3660
'bzrlib.tests.test__simple_set',
3661
'bzrlib.tests.test__static_tuple',
3662
'bzrlib.tests.test__walkdirs_win32',
3663
'bzrlib.tests.test_ancestry',
3664
'bzrlib.tests.test_annotate',
3665
'bzrlib.tests.test_api',
3666
'bzrlib.tests.test_atomicfile',
3667
'bzrlib.tests.test_bad_files',
3668
'bzrlib.tests.test_bisect_multi',
3669
'bzrlib.tests.test_branch',
3670
'bzrlib.tests.test_branchbuilder',
3671
'bzrlib.tests.test_btree_index',
3672
'bzrlib.tests.test_bugtracker',
3673
'bzrlib.tests.test_bundle',
3674
'bzrlib.tests.test_bzrdir',
3675
'bzrlib.tests.test__chunks_to_lines',
3676
'bzrlib.tests.test_cache_utf8',
3677
'bzrlib.tests.test_chk_map',
3678
'bzrlib.tests.test_chk_serializer',
3679
'bzrlib.tests.test_chunk_writer',
3680
'bzrlib.tests.test_clean_tree',
3681
'bzrlib.tests.test_cleanup',
3682
'bzrlib.tests.test_cmdline',
3683
'bzrlib.tests.test_commands',
3684
'bzrlib.tests.test_commit',
3685
'bzrlib.tests.test_commit_merge',
3686
'bzrlib.tests.test_config',
3687
'bzrlib.tests.test_conflicts',
3688
'bzrlib.tests.test_counted_lock',
3689
'bzrlib.tests.test_crash',
3690
'bzrlib.tests.test_decorators',
3691
'bzrlib.tests.test_delta',
3692
'bzrlib.tests.test_debug',
3693
'bzrlib.tests.test_deprecated_graph',
3694
'bzrlib.tests.test_diff',
3695
'bzrlib.tests.test_directory_service',
3696
'bzrlib.tests.test_dirstate',
3697
'bzrlib.tests.test_email_message',
3698
'bzrlib.tests.test_eol_filters',
3699
'bzrlib.tests.test_errors',
3700
'bzrlib.tests.test_export',
3701
'bzrlib.tests.test_extract',
3702
'bzrlib.tests.test_fetch',
3703
'bzrlib.tests.test_fifo_cache',
3704
'bzrlib.tests.test_filters',
3705
'bzrlib.tests.test_ftp_transport',
3706
'bzrlib.tests.test_foreign',
3707
'bzrlib.tests.test_generate_docs',
3708
'bzrlib.tests.test_generate_ids',
3709
'bzrlib.tests.test_globbing',
3710
'bzrlib.tests.test_gpg',
3711
'bzrlib.tests.test_graph',
3712
'bzrlib.tests.test_groupcompress',
3713
'bzrlib.tests.test_hashcache',
3714
'bzrlib.tests.test_help',
3715
'bzrlib.tests.test_hooks',
3716
'bzrlib.tests.test_http',
3717
'bzrlib.tests.test_http_response',
3718
'bzrlib.tests.test_https_ca_bundle',
3719
'bzrlib.tests.test_identitymap',
3720
'bzrlib.tests.test_ignores',
3721
'bzrlib.tests.test_index',
3722
'bzrlib.tests.test_import_tariff',
3723
'bzrlib.tests.test_info',
3724
'bzrlib.tests.test_inv',
3725
'bzrlib.tests.test_inventory_delta',
3726
'bzrlib.tests.test_knit',
3727
'bzrlib.tests.test_lazy_import',
3728
'bzrlib.tests.test_lazy_regex',
3729
'bzrlib.tests.test_lock',
3730
'bzrlib.tests.test_lockable_files',
3731
'bzrlib.tests.test_lockdir',
3732
'bzrlib.tests.test_log',
3733
'bzrlib.tests.test_lru_cache',
3734
'bzrlib.tests.test_lsprof',
3735
'bzrlib.tests.test_mail_client',
3736
'bzrlib.tests.test_memorytree',
3737
'bzrlib.tests.test_merge',
3738
'bzrlib.tests.test_merge3',
3739
'bzrlib.tests.test_merge_core',
3740
'bzrlib.tests.test_merge_directive',
3741
'bzrlib.tests.test_missing',
3742
'bzrlib.tests.test_msgeditor',
3743
'bzrlib.tests.test_multiparent',
3744
'bzrlib.tests.test_mutabletree',
3745
'bzrlib.tests.test_nonascii',
3746
'bzrlib.tests.test_options',
3747
'bzrlib.tests.test_osutils',
3748
'bzrlib.tests.test_osutils_encodings',
3749
'bzrlib.tests.test_pack',
3750
'bzrlib.tests.test_patch',
3751
'bzrlib.tests.test_patches',
3752
'bzrlib.tests.test_permissions',
3753
'bzrlib.tests.test_plugins',
3754
'bzrlib.tests.test_progress',
3755
'bzrlib.tests.test_read_bundle',
3756
'bzrlib.tests.test_reconcile',
3757
'bzrlib.tests.test_reconfigure',
3758
'bzrlib.tests.test_registry',
3759
'bzrlib.tests.test_remote',
3760
'bzrlib.tests.test_rename_map',
3761
'bzrlib.tests.test_repository',
3762
'bzrlib.tests.test_revert',
3763
'bzrlib.tests.test_revision',
3764
'bzrlib.tests.test_revisionspec',
3765
'bzrlib.tests.test_revisiontree',
3766
'bzrlib.tests.test_rio',
3767
'bzrlib.tests.test_rules',
3768
'bzrlib.tests.test_sampler',
3769
'bzrlib.tests.test_script',
3770
'bzrlib.tests.test_selftest',
3771
'bzrlib.tests.test_serializer',
3772
'bzrlib.tests.test_setup',
3773
'bzrlib.tests.test_sftp_transport',
3774
'bzrlib.tests.test_shelf',
3775
'bzrlib.tests.test_shelf_ui',
3776
'bzrlib.tests.test_smart',
3777
'bzrlib.tests.test_smart_add',
3778
'bzrlib.tests.test_smart_request',
3779
'bzrlib.tests.test_smart_transport',
3780
'bzrlib.tests.test_smtp_connection',
3781
'bzrlib.tests.test_source',
3782
'bzrlib.tests.test_ssh_transport',
3783
'bzrlib.tests.test_status',
3784
'bzrlib.tests.test_store',
3785
'bzrlib.tests.test_strace',
3786
'bzrlib.tests.test_subsume',
3787
'bzrlib.tests.test_switch',
3788
'bzrlib.tests.test_symbol_versioning',
3789
'bzrlib.tests.test_tag',
3790
'bzrlib.tests.test_testament',
3791
'bzrlib.tests.test_textfile',
3792
'bzrlib.tests.test_textmerge',
3793
'bzrlib.tests.test_timestamp',
3794
'bzrlib.tests.test_trace',
3795
'bzrlib.tests.test_transactions',
3796
'bzrlib.tests.test_transform',
3797
'bzrlib.tests.test_transport',
3798
'bzrlib.tests.test_transport_log',
3799
'bzrlib.tests.test_tree',
3800
'bzrlib.tests.test_treebuilder',
3801
'bzrlib.tests.test_tsort',
3802
'bzrlib.tests.test_tuned_gzip',
3803
'bzrlib.tests.test_ui',
3804
'bzrlib.tests.test_uncommit',
3805
'bzrlib.tests.test_upgrade',
3806
'bzrlib.tests.test_upgrade_stacked',
3807
'bzrlib.tests.test_urlutils',
3808
'bzrlib.tests.test_version',
3809
'bzrlib.tests.test_version_info',
3810
'bzrlib.tests.test_weave',
3811
'bzrlib.tests.test_whitebox',
3812
'bzrlib.tests.test_win32utils',
3813
'bzrlib.tests.test_workingtree',
3814
'bzrlib.tests.test_workingtree_4',
3815
'bzrlib.tests.test_wsgi',
3816
'bzrlib.tests.test_xml',
3854
'breezy.tests.blackbox',
3855
'breezy.tests.commands',
3856
'breezy.tests.per_branch',
3857
'breezy.tests.per_bzrdir',
3858
'breezy.tests.per_controldir',
3859
'breezy.tests.per_controldir_colo',
3860
'breezy.tests.per_foreign_vcs',
3861
'breezy.tests.per_interrepository',
3862
'breezy.tests.per_intertree',
3863
'breezy.tests.per_inventory',
3864
'breezy.tests.per_interbranch',
3865
'breezy.tests.per_lock',
3866
'breezy.tests.per_merger',
3867
'breezy.tests.per_transport',
3868
'breezy.tests.per_tree',
3869
'breezy.tests.per_pack_repository',
3870
'breezy.tests.per_repository',
3871
'breezy.tests.per_repository_chk',
3872
'breezy.tests.per_repository_reference',
3873
'breezy.tests.per_repository_vf',
3874
'breezy.tests.per_uifactory',
3875
'breezy.tests.per_versionedfile',
3876
'breezy.tests.per_workingtree',
3877
'breezy.tests.test__annotator',
3878
'breezy.tests.test__bencode',
3879
'breezy.tests.test__btree_serializer',
3880
'breezy.tests.test__chk_map',
3881
'breezy.tests.test__dirstate_helpers',
3882
'breezy.tests.test__groupcompress',
3883
'breezy.tests.test__known_graph',
3884
'breezy.tests.test__rio',
3885
'breezy.tests.test__simple_set',
3886
'breezy.tests.test__static_tuple',
3887
'breezy.tests.test__walkdirs_win32',
3888
'breezy.tests.test_ancestry',
3889
'breezy.tests.test_annotate',
3890
'breezy.tests.test_atomicfile',
3891
'breezy.tests.test_bad_files',
3892
'breezy.tests.test_bisect',
3893
'breezy.tests.test_bisect_multi',
3894
'breezy.tests.test_branch',
3895
'breezy.tests.test_branchbuilder',
3896
'breezy.tests.test_btree_index',
3897
'breezy.tests.test_bugtracker',
3898
'breezy.tests.test_bundle',
3899
'breezy.tests.test_bzrdir',
3900
'breezy.tests.test__chunks_to_lines',
3901
'breezy.tests.test_cache_utf8',
3902
'breezy.tests.test_chk_map',
3903
'breezy.tests.test_chk_serializer',
3904
'breezy.tests.test_chunk_writer',
3905
'breezy.tests.test_clean_tree',
3906
'breezy.tests.test_cleanup',
3907
'breezy.tests.test_cmdline',
3908
'breezy.tests.test_commands',
3909
'breezy.tests.test_commit',
3910
'breezy.tests.test_commit_merge',
3911
'breezy.tests.test_config',
3912
'breezy.tests.test_conflicts',
3913
'breezy.tests.test_controldir',
3914
'breezy.tests.test_counted_lock',
3915
'breezy.tests.test_crash',
3916
'breezy.tests.test_decorators',
3917
'breezy.tests.test_delta',
3918
'breezy.tests.test_debug',
3919
'breezy.tests.test_diff',
3920
'breezy.tests.test_directory_service',
3921
'breezy.tests.test_dirstate',
3922
'breezy.tests.test_email_message',
3923
'breezy.tests.test_eol_filters',
3924
'breezy.tests.test_errors',
3925
'breezy.tests.test_estimate_compressed_size',
3926
'breezy.tests.test_export',
3927
'breezy.tests.test_export_pot',
3928
'breezy.tests.test_extract',
3929
'breezy.tests.test_features',
3930
'breezy.tests.test_fetch',
3931
'breezy.tests.test_fetch_ghosts',
3932
'breezy.tests.test_fixtures',
3933
'breezy.tests.test_fifo_cache',
3934
'breezy.tests.test_filters',
3935
'breezy.tests.test_filter_tree',
3936
'breezy.tests.test_ftp_transport',
3937
'breezy.tests.test_foreign',
3938
'breezy.tests.test_generate_docs',
3939
'breezy.tests.test_generate_ids',
3940
'breezy.tests.test_globbing',
3941
'breezy.tests.test_gpg',
3942
'breezy.tests.test_graph',
3943
'breezy.tests.test_groupcompress',
3944
'breezy.tests.test_hashcache',
3945
'breezy.tests.test_help',
3946
'breezy.tests.test_hooks',
3947
'breezy.tests.test_http',
3948
'breezy.tests.test_http_response',
3949
'breezy.tests.test_https_ca_bundle',
3950
'breezy.tests.test_https_urllib',
3951
'breezy.tests.test_i18n',
3952
'breezy.tests.test_identitymap',
3953
'breezy.tests.test_ignores',
3954
'breezy.tests.test_index',
3955
'breezy.tests.test_import_tariff',
3956
'breezy.tests.test_info',
3957
'breezy.tests.test_inv',
3958
'breezy.tests.test_inventory_delta',
3959
'breezy.tests.test_knit',
3960
'breezy.tests.test_lazy_import',
3961
'breezy.tests.test_lazy_regex',
3962
'breezy.tests.test_library_state',
3963
'breezy.tests.test_lock',
3964
'breezy.tests.test_lockable_files',
3965
'breezy.tests.test_lockdir',
3966
'breezy.tests.test_log',
3967
'breezy.tests.test_lru_cache',
3968
'breezy.tests.test_lsprof',
3969
'breezy.tests.test_mail_client',
3970
'breezy.tests.test_matchers',
3971
'breezy.tests.test_memorytree',
3972
'breezy.tests.test_merge',
3973
'breezy.tests.test_merge3',
3974
'breezy.tests.test_merge_core',
3975
'breezy.tests.test_merge_directive',
3976
'breezy.tests.test_mergetools',
3977
'breezy.tests.test_missing',
3978
'breezy.tests.test_msgeditor',
3979
'breezy.tests.test_multiparent',
3980
'breezy.tests.test_mutabletree',
3981
'breezy.tests.test_nonascii',
3982
'breezy.tests.test_options',
3983
'breezy.tests.test_osutils',
3984
'breezy.tests.test_osutils_encodings',
3985
'breezy.tests.test_pack',
3986
'breezy.tests.test_patch',
3987
'breezy.tests.test_patches',
3988
'breezy.tests.test_permissions',
3989
'breezy.tests.test_plugins',
3990
'breezy.tests.test_progress',
3991
'breezy.tests.test_pyutils',
3992
'breezy.tests.test_read_bundle',
3993
'breezy.tests.test_reconcile',
3994
'breezy.tests.test_reconfigure',
3995
'breezy.tests.test_registry',
3996
'breezy.tests.test_remote',
3997
'breezy.tests.test_rename_map',
3998
'breezy.tests.test_repository',
3999
'breezy.tests.test_revert',
4000
'breezy.tests.test_revision',
4001
'breezy.tests.test_revisionspec',
4002
'breezy.tests.test_revisiontree',
4003
'breezy.tests.test_rio',
4004
'breezy.tests.test_rules',
4005
'breezy.tests.test_url_policy_open',
4006
'breezy.tests.test_sampler',
4007
'breezy.tests.test_scenarios',
4008
'breezy.tests.test_script',
4009
'breezy.tests.test_selftest',
4010
'breezy.tests.test_serializer',
4011
'breezy.tests.test_setup',
4012
'breezy.tests.test_sftp_transport',
4013
'breezy.tests.test_shelf',
4014
'breezy.tests.test_shelf_ui',
4015
'breezy.tests.test_smart',
4016
'breezy.tests.test_smart_add',
4017
'breezy.tests.test_smart_request',
4018
'breezy.tests.test_smart_signals',
4019
'breezy.tests.test_smart_transport',
4020
'breezy.tests.test_smtp_connection',
4021
'breezy.tests.test_source',
4022
'breezy.tests.test_ssh_transport',
4023
'breezy.tests.test_status',
4024
'breezy.tests.test_strace',
4025
'breezy.tests.test_subsume',
4026
'breezy.tests.test_switch',
4027
'breezy.tests.test_symbol_versioning',
4028
'breezy.tests.test_tag',
4029
'breezy.tests.test_test_server',
4030
'breezy.tests.test_testament',
4031
'breezy.tests.test_textfile',
4032
'breezy.tests.test_textmerge',
4033
'breezy.tests.test_cethread',
4034
'breezy.tests.test_timestamp',
4035
'breezy.tests.test_trace',
4036
'breezy.tests.test_transactions',
4037
'breezy.tests.test_transform',
4038
'breezy.tests.test_transport',
4039
'breezy.tests.test_transport_log',
4040
'breezy.tests.test_tree',
4041
'breezy.tests.test_treebuilder',
4042
'breezy.tests.test_treeshape',
4043
'breezy.tests.test_tsort',
4044
'breezy.tests.test_tuned_gzip',
4045
'breezy.tests.test_ui',
4046
'breezy.tests.test_uncommit',
4047
'breezy.tests.test_upgrade',
4048
'breezy.tests.test_upgrade_stacked',
4049
'breezy.tests.test_upstream_import',
4050
'breezy.tests.test_urlutils',
4051
'breezy.tests.test_utextwrap',
4052
'breezy.tests.test_version',
4053
'breezy.tests.test_version_info',
4054
'breezy.tests.test_versionedfile',
4055
'breezy.tests.test_vf_search',
4056
'breezy.tests.test_weave',
4057
'breezy.tests.test_whitebox',
4058
'breezy.tests.test_win32utils',
4059
'breezy.tests.test_workingtree',
4060
'breezy.tests.test_workingtree_4',
4061
'breezy.tests.test_wsgi',
4062
'breezy.tests.test_xml',
4086
4359
# except on win32, where rmtree(str) will fail
4087
4360
# since it doesn't have the property of byte-stream paths
4088
4361
# (they are either ascii or mbcs)
4089
if sys.platform == 'win32':
4362
if sys.platform == 'win32' and isinstance(dirname, bytes):
4090
4363
# make sure we are using the unicode win32 api
4091
dirname = unicode(dirname)
4364
dirname = dirname.decode('mbcs')
4093
4366
dirname = dirname.encode(sys.getfilesystemencoding())
4095
4368
osutils.rmtree(dirname)
4369
except OSError as e:
4097
4370
# We don't want to fail here because some useful display will be lost
4098
4371
# otherwise. Polluting the tmp dir is bad, but not giving all the
4099
4372
# possible info to the test runner is even worse.
4100
4373
if test_id != None:
4101
4374
ui.ui_factory.clear_term()
4102
4375
sys.stderr.write('\nWhile running: %s\n' % (test_id,))
4376
# Ugly, but the last thing we want here is fail, so bear with it.
4377
printable_e = str(e).decode(osutils.get_user_encoding(), 'replace'
4378
).encode('ascii', 'replace')
4103
4379
sys.stderr.write('Unable to remove testing dir %s\n%s'
4104
% (os.path.basename(dirname), e))
4107
class Feature(object):
4108
"""An operating system Feature."""
4111
self._available = None
4113
def available(self):
4114
"""Is the feature available?
4116
:return: True if the feature is available.
4118
if self._available is None:
4119
self._available = self._probe()
4120
return self._available
4123
"""Implement this method in concrete features.
4125
:return: True if the feature is available.
4127
raise NotImplementedError
4130
if getattr(self, 'feature_name', None):
4131
return self.feature_name()
4132
return self.__class__.__name__
4135
class _SymlinkFeature(Feature):
4138
return osutils.has_symlinks()
4140
def feature_name(self):
4143
SymlinkFeature = _SymlinkFeature()
4146
class _HardlinkFeature(Feature):
4149
return osutils.has_hardlinks()
4151
def feature_name(self):
4154
HardlinkFeature = _HardlinkFeature()
4157
class _OsFifoFeature(Feature):
4160
return getattr(os, 'mkfifo', None)
4162
def feature_name(self):
4163
return 'filesystem fifos'
4165
OsFifoFeature = _OsFifoFeature()
4168
class _UnicodeFilenameFeature(Feature):
4169
"""Does the filesystem support Unicode filenames?"""
4173
# Check for character combinations unlikely to be covered by any
4174
# single non-unicode encoding. We use the characters
4175
# - greek small letter alpha (U+03B1) and
4176
# - braille pattern dots-123456 (U+283F).
4177
os.stat(u'\u03b1\u283f')
4178
except UnicodeEncodeError:
4180
except (IOError, OSError):
4181
# The filesystem allows the Unicode filename but the file doesn't
4185
# The filesystem allows the Unicode filename and the file exists,
4189
UnicodeFilenameFeature = _UnicodeFilenameFeature()
4192
class _CompatabilityThunkFeature(Feature):
4193
"""This feature is just a thunk to another feature.
4195
It issues a deprecation warning if it is accessed, to let you know that you
4196
should really use a different feature.
4199
def __init__(self, dep_version, module, name,
4200
replacement_name, replacement_module=None):
4201
super(_CompatabilityThunkFeature, self).__init__()
4202
self._module = module
4203
if replacement_module is None:
4204
replacement_module = module
4205
self._replacement_module = replacement_module
4207
self._replacement_name = replacement_name
4208
self._dep_version = dep_version
4209
self._feature = None
4212
if self._feature is None:
4213
depr_msg = self._dep_version % ('%s.%s'
4214
% (self._module, self._name))
4215
use_msg = ' Use %s.%s instead.' % (self._replacement_module,
4216
self._replacement_name)
4217
symbol_versioning.warn(depr_msg + use_msg, DeprecationWarning)
4218
# Import the new feature and use it as a replacement for the
4220
mod = __import__(self._replacement_module, {}, {},
4221
[self._replacement_name])
4222
self._feature = getattr(mod, self._replacement_name)
4226
return self._feature._probe()
4229
class ModuleAvailableFeature(Feature):
4230
"""This is a feature than describes a module we want to be available.
4232
Declare the name of the module in __init__(), and then after probing, the
4233
module will be available as 'self.module'.
4235
:ivar module: The module if it is available, else None.
4238
def __init__(self, module_name):
4239
super(ModuleAvailableFeature, self).__init__()
4240
self.module_name = module_name
4244
self._module = __import__(self.module_name, {}, {}, [''])
4251
if self.available(): # Make sure the probe has been done
4255
def feature_name(self):
4256
return self.module_name
4259
# This is kept here for compatibility, it is recommended to use
4260
# 'bzrlib.tests.feature.paramiko' instead
4261
ParamikoFeature = _CompatabilityThunkFeature(
4262
deprecated_in((2,1,0)),
4263
'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
4380
% (os.path.basename(dirname), printable_e))
4266
4383
def probe_unicode_in_user_encoding():