1196
1197
"""Make the logfile not be deleted when _finishLogFile is called."""
1197
1198
self._keep_log_file = True
1199
def addCleanup(self, callable):
1200
def addCleanup(self, callable, *args, **kwargs):
1200
1201
"""Arrange to run a callable when this case is torn down.
1202
1203
Callables are run in the reverse of the order they are registered,
1203
1204
ie last-in first-out.
1205
if callable in self._cleanups:
1206
raise ValueError("cleanup function %r already registered on %s"
1208
self._cleanups.append(callable)
1206
self._cleanups.append((callable, args, kwargs))
1210
1208
def _cleanEnvironment(self):
1591
1590
# so we will avoid using it on all platforms, just to
1592
1591
# make sure the code path is used, and we don't break on win32
1593
1592
cleanup_environment()
1594
command = [sys.executable, bzr_path]
1593
command = [sys.executable]
1594
# frozen executables don't need the path to bzr
1595
if getattr(sys, "frozen", None) is None:
1596
command.append(bzr_path)
1595
1597
if not allow_plugins:
1596
1598
command.append('--no-plugins')
1597
1599
command.extend(process_args)
2063
2065
For TestCaseInTempDir we create a temporary directory based on the test
2064
2066
name and then create two subdirs - test and home under it.
2066
name_prefix = os.path.join(self.TEST_ROOT, self._getTestDirPrefix())
2068
name_prefix = osutils.pathjoin(self.TEST_ROOT, self._getTestDirPrefix())
2067
2069
name = name_prefix
2068
2070
for i in range(100):
2069
2071
if os.path.exists(name):
2138
2140
tree = workingtree.WorkingTree.open(root_path)
2139
2141
if not isinstance(path, basestring):
2141
self.assertInWorkingTree(p,tree=tree)
2143
self.assertInWorkingTree(p, tree=tree)
2143
2145
self.assertIsNot(tree.path2id(path), None,
2144
2146
path+' not in working tree.')
2301
2303
return condition
2304
def condition_id_startswith(start):
2306
def condition_id_startswith(starts):
2305
2307
"""Create a condition filter verifying that test's id starts with a string.
2307
:param start: A string.
2308
:return: A callable that returns True if the test's id starts with the
2309
:param starts: A list of string.
2310
:return: A callable that returns True if the test's id starts with one of
2311
2313
def condition(test):
2312
return test.id().startswith(start)
2314
for start in starts:
2315
if test.id().startswith(start):
2313
2318
return condition
2351
2356
:param suite: the source suite
2352
2357
:param pattern: pattern that names must match
2353
2358
:returns: the newly created suite
2355
2360
condition = condition_id_re(pattern)
2356
2361
result_suite = filter_suite_by_condition(suite, condition)
2357
2362
return result_suite
2373
2378
"""Create a test suite by filtering another one.
2375
2380
:param suite: The source suite.
2376
:param start: A string the test id must start with.
2381
:param start: A list of string the test id must start with one of.
2377
2382
:returns: the newly created suite
2379
2384
condition = condition_id_startswith(start)
2670
2675
return self.tests.has_key(test_id)
2678
class TestPrefixAliasRegistry(registry.Registry):
2679
"""A registry for test prefix aliases.
2681
This helps implement shorcuts for the --starting-with selftest
2682
option. Overriding existing prefixes is not allowed but not fatal (a
2683
warning will be emitted).
2686
def register(self, key, obj, help=None, info=None,
2687
override_existing=False):
2688
"""See Registry.register.
2690
Trying to override an existing alias causes a warning to be emitted,
2691
not a fatal execption.
2694
super(TestPrefixAliasRegistry, self).register(
2695
key, obj, help=help, info=info, override_existing=False)
2697
actual = self.get(key)
2698
note('Test prefix alias %s is already used for %s, ignoring %s'
2699
% (key, actual, obj))
2701
def resolve_alias(self, id_start):
2702
"""Replace the alias by the prefix in the given string.
2704
Using an unknown prefix is an error to help catching typos.
2706
parts = id_start.split('.')
2708
parts[0] = self.get(parts[0])
2710
raise errors.BzrCommandError(
2711
'%s is not a known test prefix alias' % parts[0])
2712
return '.'.join(parts)
2715
test_prefix_alias_registry = TestPrefixAliasRegistry()
2716
"""Registry of test prefix aliases."""
2719
# This alias allows to detect typos ('bzrlin.') by making all valid test ids
2720
# appear prefixed ('bzrlib.' is "replaced" by 'bzrlib.').
2721
test_prefix_alias_registry.register('bzrlib', 'bzrlib')
2723
# Obvious higest levels prefixes, feel free to add your own via a plugin
2724
test_prefix_alias_registry.register('bd', 'bzrlib.doc')
2725
test_prefix_alias_registry.register('bu', 'bzrlib.utils')
2726
test_prefix_alias_registry.register('bt', 'bzrlib.tests')
2727
test_prefix_alias_registry.register('bb', 'bzrlib.tests.blackbox')
2728
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
2673
2731
def test_suite(keep_only=None, starting_with=None):
2674
2732
"""Build and return TestSuite for the whole of bzrlib.
2702
2760
'bzrlib.tests.test_bisect_multi',
2703
2761
'bzrlib.tests.test_branch',
2704
2762
'bzrlib.tests.test_branchbuilder',
2763
'bzrlib.tests.test_btree_index',
2705
2764
'bzrlib.tests.test_bugtracker',
2706
2765
'bzrlib.tests.test_bundle',
2707
2766
'bzrlib.tests.test_bzrdir',
2708
2767
'bzrlib.tests.test_cache_utf8',
2768
'bzrlib.tests.test_chunk_writer',
2709
2769
'bzrlib.tests.test_commands',
2710
2770
'bzrlib.tests.test_commit',
2711
2771
'bzrlib.tests.test_commit_merge',
2763
2823
'bzrlib.tests.test_osutils',
2764
2824
'bzrlib.tests.test_osutils_encodings',
2765
2825
'bzrlib.tests.test_pack',
2826
'bzrlib.tests.test_pack_repository',
2766
2827
'bzrlib.tests.test_patch',
2767
2828
'bzrlib.tests.test_patches',
2768
2829
'bzrlib.tests.test_permissions',
2807
2868
'bzrlib.tests.test_transform',
2808
2869
'bzrlib.tests.test_transport',
2809
2870
'bzrlib.tests.test_transport_implementations',
2871
'bzrlib.tests.test_transport_log',
2810
2872
'bzrlib.tests.test_tree',
2811
2873
'bzrlib.tests.test_treebuilder',
2812
2874
'bzrlib.tests.test_tsort',
2814
2876
'bzrlib.tests.test_ui',
2815
2877
'bzrlib.tests.test_uncommit',
2816
2878
'bzrlib.tests.test_upgrade',
2879
'bzrlib.tests.test_upgrade_stacked',
2817
2880
'bzrlib.tests.test_urlutils',
2818
2881
'bzrlib.tests.test_versionedfile',
2819
2882
'bzrlib.tests.test_version',
2833
2896
loader = TestUtil.TestLoader()
2835
if starting_with is not None:
2899
starting_with = [test_prefix_alias_registry.resolve_alias(start)
2900
for start in starting_with]
2836
2901
# We take precedence over keep_only because *at loading time* using
2837
2902
# both options means we will load less tests for the same final result.
2838
2903
def interesting_module(name):
2840
# Either the module name starts with the specified string
2841
name.startswith(starting_with)
2842
# or it may contain tests starting with the specified string
2843
or starting_with.startswith(name)
2904
for start in starting_with:
2906
# Either the module name starts with the specified string
2907
name.startswith(start)
2908
# or it may contain tests starting with the specified string
2909
or start.startswith(name)
2845
2913
loader = TestUtil.FilteredByModuleTestLoader(interesting_module)
2847
2915
elif keep_only is not None:
2916
2984
suite = filter_suite_by_id_list(suite, id_filter)
2917
2985
# Do some sanity checks on the id_list filtering
2918
2986
not_found, duplicates = suite_matches_id_list(suite, keep_only)
2919
if starting_with is not None:
2920
2988
# The tester has used both keep_only and starting_with, so he is
2921
2989
# already aware that some tests are excluded from the list, there
2922
2990
# is no need to tell him which.