1507
1724
:returns: The actual attr value.
1509
value = getattr(obj, attr_name)
1510
1726
# The actual value is captured by the call below
1511
self.addCleanup(setattr, obj, attr_name, value)
1727
value = getattr(obj, attr_name, _unitialized_attr)
1728
if value is _unitialized_attr:
1729
# When the test completes, the attribute should not exist, but if
1730
# we aren't setting a value, we don't need to do anything.
1731
if new is not _unitialized_attr:
1732
self.addCleanup(delattr, obj, attr_name)
1734
self.addCleanup(setattr, obj, attr_name, value)
1512
1735
if new is not _unitialized_attr:
1513
1736
setattr(obj, attr_name, new)
1739
def overrideEnv(self, name, new):
1740
"""Set an environment variable, and reset it after the test.
1742
:param name: The environment variable name.
1744
:param new: The value to set the variable to. If None, the
1745
variable is deleted from the environment.
1747
:returns: The actual variable value.
1749
value = osutils.set_or_unset_env(name, new)
1750
self.addCleanup(osutils.set_or_unset_env, name, value)
1753
def recordCalls(self, obj, attr_name):
1754
"""Monkeypatch in a wrapper that will record calls.
1756
The monkeypatch is automatically removed when the test concludes.
1758
:param obj: The namespace holding the reference to be replaced;
1759
typically a module, class, or object.
1760
:param attr_name: A string for the name of the attribute to
1762
:returns: A list that will be extended with one item every time the
1763
function is called, with a tuple of (args, kwargs).
1767
def decorator(*args, **kwargs):
1768
calls.append((args, kwargs))
1769
return orig(*args, **kwargs)
1770
orig = self.overrideAttr(obj, attr_name, decorator)
1516
1773
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)
1774
for name, value in isolated_environ.items():
1775
self.overrideEnv(name, value)
1578
1777
def _restoreHooks(self):
1579
1778
for klass, (name, hooks) in self._preserved_hooks.items():
1580
1779
setattr(klass, name, hooks)
1780
self._preserved_hooks.clear()
1781
breezy.hooks._lazy_hooks = self._preserved_lazy_hooks
1782
self._preserved_lazy_hooks.clear()
1582
1784
def knownFailure(self, reason):
1583
"""This test has failed for some known reason."""
1584
raise KnownFailure(reason)
1785
"""Declare that this test fails for a known reason
1787
Tests that are known to fail should generally be using expectedFailure
1788
with an appropriate reverse assertion if a change could cause the test
1789
to start passing. Conversely if the test has no immediate prospect of
1790
succeeding then using skip is more suitable.
1792
When this method is called while an exception is being handled, that
1793
traceback will be used, otherwise a new exception will be thrown to
1794
provide one but won't be reported.
1796
self._add_reason(reason)
1798
exc_info = sys.exc_info()
1799
if exc_info != (None, None, None):
1800
self._report_traceback(exc_info)
1803
raise self.failureException(reason)
1804
except self.failureException:
1805
exc_info = sys.exc_info()
1806
# GZ 02-08-2011: Maybe cleanup this err.exc_info attribute too?
1807
raise testtools.testcase._ExpectedFailure(exc_info)
1811
def _suppress_log(self):
1812
"""Remove the log info from details."""
1813
self.discardDetail('log')
1586
1815
def _do_skip(self, result, reason):
1816
self._suppress_log()
1587
1817
addSkip = getattr(result, 'addSkip', None)
1588
1818
if not callable(addSkip):
1589
1819
result.addSuccess(result)
1591
addSkip(self, reason)
1821
addSkip(self, str(reason))
1594
1824
def _do_known_failure(self, result, e):
1825
self._suppress_log()
1595
1826
err = sys.exc_info()
1596
1827
addExpectedFailure = getattr(result, 'addExpectedFailure', None)
1597
1828
if addExpectedFailure is not None:
3617
3859
# 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')
3860
# appear prefixed ('breezy.' is "replaced" by 'breezy.').
3861
test_prefix_alias_registry.register('breezy', 'breezy')
3621
3863
# Obvious highest levels prefixes, feel free to add your own via a plugin
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')
3864
test_prefix_alias_registry.register('bd', 'breezy.doc')
3865
test_prefix_alias_registry.register('bu', 'breezy.utils')
3866
test_prefix_alias_registry.register('bt', 'breezy.tests')
3867
test_prefix_alias_registry.register('bb', 'breezy.tests.blackbox')
3868
test_prefix_alias_registry.register('bp', 'breezy.plugins')
3629
3871
def _test_suite_testmod_names():
3630
3872
"""Return the standard list of test module names to test."""
3633
'bzrlib.tests.blackbox',
3634
'bzrlib.tests.commands',
3635
'bzrlib.tests.per_branch',
3636
'bzrlib.tests.per_bzrdir',
3637
'bzrlib.tests.per_bzrdir_colo',
3638
'bzrlib.tests.per_foreign_vcs',
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',
3644
'bzrlib.tests.per_merger',
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',
3651
'bzrlib.tests.per_uifactory',
3652
'bzrlib.tests.per_versionedfile',
3653
'bzrlib.tests.per_workingtree',
3654
'bzrlib.tests.test__annotator',
3655
'bzrlib.tests.test__bencode',
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',
3661
'bzrlib.tests.test__simple_set',
3662
'bzrlib.tests.test__static_tuple',
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',
3682
'bzrlib.tests.test_cleanup',
3683
'bzrlib.tests.test_cmdline',
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',
3723
'bzrlib.tests.test_import_tariff',
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',
3737
'bzrlib.tests.test_matchers',
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',
3771
'bzrlib.tests.test_script',
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',
3875
'breezy.tests.blackbox',
3876
'breezy.tests.commands',
3877
'breezy.tests.per_branch',
3878
'breezy.tests.per_bzrdir',
3879
'breezy.tests.per_controldir',
3880
'breezy.tests.per_controldir_colo',
3881
'breezy.tests.per_foreign_vcs',
3882
'breezy.tests.per_interrepository',
3883
'breezy.tests.per_intertree',
3884
'breezy.tests.per_inventory',
3885
'breezy.tests.per_interbranch',
3886
'breezy.tests.per_lock',
3887
'breezy.tests.per_merger',
3888
'breezy.tests.per_transport',
3889
'breezy.tests.per_tree',
3890
'breezy.tests.per_pack_repository',
3891
'breezy.tests.per_repository',
3892
'breezy.tests.per_repository_chk',
3893
'breezy.tests.per_repository_reference',
3894
'breezy.tests.per_repository_vf',
3895
'breezy.tests.per_uifactory',
3896
'breezy.tests.per_versionedfile',
3897
'breezy.tests.per_workingtree',
3898
'breezy.tests.test__annotator',
3899
'breezy.tests.test__bencode',
3900
'breezy.tests.test__btree_serializer',
3901
'breezy.tests.test__chk_map',
3902
'breezy.tests.test__dirstate_helpers',
3903
'breezy.tests.test__groupcompress',
3904
'breezy.tests.test__known_graph',
3905
'breezy.tests.test__rio',
3906
'breezy.tests.test__simple_set',
3907
'breezy.tests.test__static_tuple',
3908
'breezy.tests.test__walkdirs_win32',
3909
'breezy.tests.test_ancestry',
3910
'breezy.tests.test_annotate',
3911
'breezy.tests.test_atomicfile',
3912
'breezy.tests.test_bad_files',
3913
'breezy.tests.test_bisect',
3914
'breezy.tests.test_bisect_multi',
3915
'breezy.tests.test_branch',
3916
'breezy.tests.test_branchbuilder',
3917
'breezy.tests.test_btree_index',
3918
'breezy.tests.test_bugtracker',
3919
'breezy.tests.test_bundle',
3920
'breezy.tests.test_bzrdir',
3921
'breezy.tests.test__chunks_to_lines',
3922
'breezy.tests.test_cache_utf8',
3923
'breezy.tests.test_chk_map',
3924
'breezy.tests.test_chk_serializer',
3925
'breezy.tests.test_chunk_writer',
3926
'breezy.tests.test_clean_tree',
3927
'breezy.tests.test_cleanup',
3928
'breezy.tests.test_cmdline',
3929
'breezy.tests.test_commands',
3930
'breezy.tests.test_commit',
3931
'breezy.tests.test_commit_merge',
3932
'breezy.tests.test_config',
3933
'breezy.tests.test_conflicts',
3934
'breezy.tests.test_controldir',
3935
'breezy.tests.test_counted_lock',
3936
'breezy.tests.test_crash',
3937
'breezy.tests.test_decorators',
3938
'breezy.tests.test_delta',
3939
'breezy.tests.test_debug',
3940
'breezy.tests.test_diff',
3941
'breezy.tests.test_directory_service',
3942
'breezy.tests.test_dirstate',
3943
'breezy.tests.test_email_message',
3944
'breezy.tests.test_eol_filters',
3945
'breezy.tests.test_errors',
3946
'breezy.tests.test_estimate_compressed_size',
3947
'breezy.tests.test_export',
3948
'breezy.tests.test_export_pot',
3949
'breezy.tests.test_extract',
3950
'breezy.tests.test_features',
3951
'breezy.tests.test_fetch',
3952
'breezy.tests.test_fetch_ghosts',
3953
'breezy.tests.test_fixtures',
3954
'breezy.tests.test_fifo_cache',
3955
'breezy.tests.test_filters',
3956
'breezy.tests.test_filter_tree',
3957
'breezy.tests.test_foreign',
3958
'breezy.tests.test_generate_docs',
3959
'breezy.tests.test_generate_ids',
3960
'breezy.tests.test_globbing',
3961
'breezy.tests.test_gpg',
3962
'breezy.tests.test_graph',
3963
'breezy.tests.test_groupcompress',
3964
'breezy.tests.test_hashcache',
3965
'breezy.tests.test_help',
3966
'breezy.tests.test_hooks',
3967
'breezy.tests.test_http',
3968
'breezy.tests.test_http_response',
3969
'breezy.tests.test_https_ca_bundle',
3970
'breezy.tests.test_https_urllib',
3971
'breezy.tests.test_i18n',
3972
'breezy.tests.test_identitymap',
3973
'breezy.tests.test_ignores',
3974
'breezy.tests.test_index',
3975
'breezy.tests.test_import_tariff',
3976
'breezy.tests.test_info',
3977
'breezy.tests.test_inv',
3978
'breezy.tests.test_inventory_delta',
3979
'breezy.tests.test_knit',
3980
'breezy.tests.test_lazy_import',
3981
'breezy.tests.test_lazy_regex',
3982
'breezy.tests.test_library_state',
3983
'breezy.tests.test_lock',
3984
'breezy.tests.test_lockable_files',
3985
'breezy.tests.test_lockdir',
3986
'breezy.tests.test_log',
3987
'breezy.tests.test_lru_cache',
3988
'breezy.tests.test_lsprof',
3989
'breezy.tests.test_mail_client',
3990
'breezy.tests.test_matchers',
3991
'breezy.tests.test_memorytree',
3992
'breezy.tests.test_merge',
3993
'breezy.tests.test_merge3',
3994
'breezy.tests.test_merge_core',
3995
'breezy.tests.test_merge_directive',
3996
'breezy.tests.test_mergetools',
3997
'breezy.tests.test_missing',
3998
'breezy.tests.test_msgeditor',
3999
'breezy.tests.test_multiparent',
4000
'breezy.tests.test_mutabletree',
4001
'breezy.tests.test_nonascii',
4002
'breezy.tests.test_options',
4003
'breezy.tests.test_osutils',
4004
'breezy.tests.test_osutils_encodings',
4005
'breezy.tests.test_pack',
4006
'breezy.tests.test_patch',
4007
'breezy.tests.test_patches',
4008
'breezy.tests.test_permissions',
4009
'breezy.tests.test_plugins',
4010
'breezy.tests.test_progress',
4011
'breezy.tests.test_pyutils',
4012
'breezy.tests.test_read_bundle',
4013
'breezy.tests.test_reconcile',
4014
'breezy.tests.test_reconfigure',
4015
'breezy.tests.test_registry',
4016
'breezy.tests.test_remote',
4017
'breezy.tests.test_rename_map',
4018
'breezy.tests.test_repository',
4019
'breezy.tests.test_revert',
4020
'breezy.tests.test_revision',
4021
'breezy.tests.test_revisionspec',
4022
'breezy.tests.test_revisiontree',
4023
'breezy.tests.test_rio',
4024
'breezy.tests.test_rules',
4025
'breezy.tests.test_url_policy_open',
4026
'breezy.tests.test_sampler',
4027
'breezy.tests.test_scenarios',
4028
'breezy.tests.test_script',
4029
'breezy.tests.test_selftest',
4030
'breezy.tests.test_serializer',
4031
'breezy.tests.test_setup',
4032
'breezy.tests.test_sftp_transport',
4033
'breezy.tests.test_shelf',
4034
'breezy.tests.test_shelf_ui',
4035
'breezy.tests.test_smart',
4036
'breezy.tests.test_smart_add',
4037
'breezy.tests.test_smart_request',
4038
'breezy.tests.test_smart_signals',
4039
'breezy.tests.test_smart_transport',
4040
'breezy.tests.test_smtp_connection',
4041
'breezy.tests.test_source',
4042
'breezy.tests.test_ssh_transport',
4043
'breezy.tests.test_status',
4044
'breezy.tests.test_strace',
4045
'breezy.tests.test_subsume',
4046
'breezy.tests.test_switch',
4047
'breezy.tests.test_symbol_versioning',
4048
'breezy.tests.test_tag',
4049
'breezy.tests.test_test_server',
4050
'breezy.tests.test_testament',
4051
'breezy.tests.test_textfile',
4052
'breezy.tests.test_textmerge',
4053
'breezy.tests.test_cethread',
4054
'breezy.tests.test_timestamp',
4055
'breezy.tests.test_trace',
4056
'breezy.tests.test_transactions',
4057
'breezy.tests.test_transform',
4058
'breezy.tests.test_transport',
4059
'breezy.tests.test_transport_log',
4060
'breezy.tests.test_tree',
4061
'breezy.tests.test_treebuilder',
4062
'breezy.tests.test_treeshape',
4063
'breezy.tests.test_tsort',
4064
'breezy.tests.test_tuned_gzip',
4065
'breezy.tests.test_ui',
4066
'breezy.tests.test_uncommit',
4067
'breezy.tests.test_upgrade',
4068
'breezy.tests.test_upgrade_stacked',
4069
'breezy.tests.test_upstream_import',
4070
'breezy.tests.test_urlutils',
4071
'breezy.tests.test_utextwrap',
4072
'breezy.tests.test_version',
4073
'breezy.tests.test_version_info',
4074
'breezy.tests.test_versionedfile',
4075
'breezy.tests.test_vf_search',
4076
'breezy.tests.test_views',
4077
'breezy.tests.test_weave',
4078
'breezy.tests.test_whitebox',
4079
'breezy.tests.test_win32utils',
4080
'breezy.tests.test_workingtree',
4081
'breezy.tests.test_workingtree_4',
4082
'breezy.tests.test_wsgi',
4083
'breezy.tests.test_xml',
4088
4380
# except on win32, where rmtree(str) will fail
4089
4381
# since it doesn't have the property of byte-stream paths
4090
4382
# (they are either ascii or mbcs)
4091
if sys.platform == 'win32':
4383
if sys.platform == 'win32' and isinstance(dirname, bytes):
4092
4384
# make sure we are using the unicode win32 api
4093
dirname = unicode(dirname)
4385
dirname = dirname.decode('mbcs')
4095
4387
dirname = dirname.encode(sys.getfilesystemencoding())
4097
4389
osutils.rmtree(dirname)
4390
except OSError as e:
4099
4391
# We don't want to fail here because some useful display will be lost
4100
4392
# otherwise. Polluting the tmp dir is bad, but not giving all the
4101
4393
# possible info to the test runner is even worse.
4102
4394
if test_id != None:
4103
4395
ui.ui_factory.clear_term()
4104
4396
sys.stderr.write('\nWhile running: %s\n' % (test_id,))
4397
# Ugly, but the last thing we want here is fail, so bear with it.
4398
printable_e = str(e).decode(osutils.get_user_encoding(), 'replace'
4399
).encode('ascii', 'replace')
4105
4400
sys.stderr.write('Unable to remove testing dir %s\n%s'
4106
% (os.path.basename(dirname), e))
4109
class Feature(object):
4110
"""An operating system Feature."""
4113
self._available = None
4115
def available(self):
4116
"""Is the feature available?
4118
:return: True if the feature is available.
4120
if self._available is None:
4121
self._available = self._probe()
4122
return self._available
4125
"""Implement this method in concrete features.
4127
:return: True if the feature is available.
4129
raise NotImplementedError
4132
if getattr(self, 'feature_name', None):
4133
return self.feature_name()
4134
return self.__class__.__name__
4137
class _SymlinkFeature(Feature):
4140
return osutils.has_symlinks()
4142
def feature_name(self):
4145
SymlinkFeature = _SymlinkFeature()
4148
class _HardlinkFeature(Feature):
4151
return osutils.has_hardlinks()
4153
def feature_name(self):
4156
HardlinkFeature = _HardlinkFeature()
4159
class _OsFifoFeature(Feature):
4162
return getattr(os, 'mkfifo', None)
4164
def feature_name(self):
4165
return 'filesystem fifos'
4167
OsFifoFeature = _OsFifoFeature()
4170
class _UnicodeFilenameFeature(Feature):
4171
"""Does the filesystem support Unicode filenames?"""
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')
4180
except UnicodeEncodeError:
4182
except (IOError, OSError):
4183
# The filesystem allows the Unicode filename but the file doesn't
4187
# The filesystem allows the Unicode filename and the file exists,
4191
UnicodeFilenameFeature = _UnicodeFilenameFeature()
4194
class _CompatabilityThunkFeature(Feature):
4195
"""This feature is just a thunk to another feature.
4197
It issues a deprecation warning if it is accessed, to let you know that you
4198
should really use a different feature.
4201
def __init__(self, dep_version, module, name,
4202
replacement_name, replacement_module=None):
4203
super(_CompatabilityThunkFeature, self).__init__()
4204
self._module = module
4205
if replacement_module is None:
4206
replacement_module = module
4207
self._replacement_module = replacement_module
4209
self._replacement_name = replacement_name
4210
self._dep_version = dep_version
4211
self._feature = None
4214
if self._feature is None:
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)
4220
# Import the new feature and use it as a replacement for the
4222
mod = __import__(self._replacement_module, {}, {},
4223
[self._replacement_name])
4224
self._feature = getattr(mod, self._replacement_name)
4228
return self._feature._probe()
4231
class ModuleAvailableFeature(Feature):
4232
"""This is a feature than describes a module we want to be available.
4234
Declare the name of the module in __init__(), and then after probing, the
4235
module will be available as 'self.module'.
4237
:ivar module: The module if it is available, else None.
4240
def __init__(self, module_name):
4241
super(ModuleAvailableFeature, self).__init__()
4242
self.module_name = module_name
4246
self._module = __import__(self.module_name, {}, {}, [''])
4253
if self.available(): # Make sure the probe has been done
4257
def feature_name(self):
4258
return self.module_name
4261
# This is kept here for compatibility, it is recommended to use
4262
# 'bzrlib.tests.feature.paramiko' instead
4263
ParamikoFeature = _CompatabilityThunkFeature(
4264
deprecated_in((2,1,0)),
4265
'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
4401
% (os.path.basename(dirname), printable_e))
4268
4404
def probe_unicode_in_user_encoding():
4301
class _HTTPSServerFeature(Feature):
4302
"""Some tests want an https Server, check if one is available.
4304
Right now, the only way this is available is under python2.6 which provides
4315
def feature_name(self):
4316
return 'HTTPSServer'
4319
HTTPSServerFeature = _HTTPSServerFeature()
4322
class _UnicodeFilename(Feature):
4323
"""Does the filesystem support Unicode filenames?"""
4328
except UnicodeEncodeError:
4330
except (IOError, OSError):
4331
# The filesystem allows the Unicode filename but the file doesn't
4335
# The filesystem allows the Unicode filename and the file exists,
4339
UnicodeFilename = _UnicodeFilename()
4342
class _UTF8Filesystem(Feature):
4343
"""Is the filesystem UTF-8?"""
4346
if osutils._fs_enc.upper() in ('UTF-8', 'UTF8'):
4350
UTF8Filesystem = _UTF8Filesystem()
4353
class _BreakinFeature(Feature):
4354
"""Does this platform support the breakin feature?"""
4357
from bzrlib import breakin
4358
if breakin.determine_signal() is None:
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
4370
def feature_name(self):
4371
return "SIGQUIT or SIGBREAK w/ctypes on win32"
4374
BreakinFeature = _BreakinFeature()
4377
class _CaseInsCasePresFilenameFeature(Feature):
4378
"""Is the file-system case insensitive, but case-preserving?"""
4381
fileno, name = tempfile.mkstemp(prefix='MixedCase')
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)
4388
return (found_rel == rel
4389
and os.path.isfile(name.upper())
4390
and os.path.isfile(name.lower()))
4395
def feature_name(self):
4396
return "case-insensitive case-preserving filesystem"
4398
CaseInsCasePresFilenameFeature = _CaseInsCasePresFilenameFeature()
4401
class _CaseInsensitiveFilesystemFeature(Feature):
4402
"""Check if underlying filesystem is case-insensitive but *not* case
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.
4409
if CaseInsCasePresFilenameFeature.available():
4412
if TestCaseWithMemoryTransport.TEST_ROOT is None:
4413
root = osutils.mkdtemp(prefix='testbzr-', suffix='.tmp')
4414
TestCaseWithMemoryTransport.TEST_ROOT = root
4416
root = TestCaseWithMemoryTransport.TEST_ROOT
4417
tdir = osutils.mkdtemp(prefix='case-sensitive-probe-', suffix='',
4419
name_a = osutils.pathjoin(tdir, 'a')
4420
name_A = osutils.pathjoin(tdir, 'A')
4422
result = osutils.isdir(name_A)
4423
_rmtree_temp_dir(tdir)
4426
def feature_name(self):
4427
return 'case-insensitive filesystem'
4429
CaseInsensitiveFilesystemFeature = _CaseInsensitiveFilesystemFeature()
4432
class _CaseSensitiveFilesystemFeature(Feature):
4435
if CaseInsCasePresFilenameFeature.available():
4437
elif CaseInsensitiveFilesystemFeature.available():
4442
def feature_name(self):
4443
return 'case-sensitive filesystem'
4445
# new coding style is for feature instances to be lowercase
4446
case_sensitive_filesystem_feature = _CaseSensitiveFilesystemFeature()
4449
# Kept for compatibility, use bzrlib.tests.features.subunit instead
4450
SubUnitFeature = _CompatabilityThunkFeature(
4451
deprecated_in((2,1,0)),
4452
'bzrlib.tests.features', 'SubUnitFeature', 'subunit')
4453
4437
# Only define SubUnitBzrRunner if subunit is available.
4455
4439
from subunit import TestProtocolClient
4456
4440
from subunit.test_results import AutoTimingTestResultDecorator
4457
class SubUnitBzrRunner(TextTestRunner):
4442
class SubUnitBzrProtocolClientv1(TestProtocolClient):
4444
def stopTest(self, test):
4445
super(SubUnitBzrProtocolClientv1, self).stopTest(test)
4446
_clear__type_equality_funcs(test)
4448
def addSuccess(self, test, details=None):
4449
# The subunit client always includes the details in the subunit
4450
# stream, but we don't want to include it in ours.
4451
if details is not None and 'log' in details:
4453
return super(SubUnitBzrProtocolClientv1, self).addSuccess(
4456
class SubUnitBzrRunnerv1(TextTestRunner):
4458
4458
def run(self, test):
4459
4459
result = AutoTimingTestResultDecorator(
4460
TestProtocolClient(self.stream))
4460
SubUnitBzrProtocolClientv1(self.stream))
4461
4461
test.run(result)
4463
4463
except ImportError:
4466
class _PosixPermissionsFeature(Feature):
4470
# create temporary file and check if specified perms are maintained.
4473
write_perms = stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
4474
f = tempfile.mkstemp(prefix='bzr_perms_chk_')
4477
os.chmod(name, write_perms)
4479
read_perms = os.stat(name).st_mode & 0777
4481
return (write_perms == read_perms)
4483
return (os.name == 'posix') and has_perms()
4485
def feature_name(self):
4486
return 'POSIX permissions support'
4488
posix_permissions_feature = _PosixPermissionsFeature()
4468
from subunit.run import SubunitTestRunner
4470
class SubUnitBzrRunnerv2(TextTestRunner, SubunitTestRunner):
4472
def __init__(self, stream=sys.stderr, descriptions=0, verbosity=1,
4473
bench_history=None, strict=False, result_decorators=None):
4474
TextTestRunner.__init__(
4475
self, stream=stream,
4476
descriptions=descriptions, verbosity=verbosity,
4477
bench_history=bench_history, strict=strict,
4478
result_decorators=result_decorators)
4479
SubunitTestRunner.__init__(self, verbosity=verbosity,
4482
run = SubunitTestRunner.run