168
195
self._overall_start_time = time.time()
169
196
self._strict = strict
198
def stopTestRun(self):
201
stopTime = time.time()
202
timeTaken = stopTime - self.startTime
204
self.stream.writeln(self.separator2)
205
self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
206
run, run != 1 and "s" or "", timeTaken))
207
self.stream.writeln()
208
if not self.wasSuccessful():
209
self.stream.write("FAILED (")
210
failed, errored = map(len, (self.failures, self.errors))
212
self.stream.write("failures=%d" % failed)
214
if failed: self.stream.write(", ")
215
self.stream.write("errors=%d" % errored)
216
if self.known_failure_count:
217
if failed or errored: self.stream.write(", ")
218
self.stream.write("known_failure_count=%d" %
219
self.known_failure_count)
220
self.stream.writeln(")")
222
if self.known_failure_count:
223
self.stream.writeln("OK (known_failures=%d)" %
224
self.known_failure_count)
226
self.stream.writeln("OK")
227
if self.skip_count > 0:
228
skipped = self.skip_count
229
self.stream.writeln('%d test%s skipped' %
230
(skipped, skipped != 1 and "s" or ""))
232
for feature, count in sorted(self.unsupported.items()):
233
self.stream.writeln("Missing feature '%s' skipped %d tests." %
173
236
ok = self.wasStrictlySuccessful()
175
238
ok = self.wasSuccessful()
177
self.stream.write('tests passed\n')
179
self.stream.write('tests failed\n')
180
239
if TestCase._first_thread_leaker_id:
181
240
self.stream.write(
182
241
'%s is leaking threads among %d leaking tests.\n' % (
183
242
TestCase._first_thread_leaker_id,
184
243
TestCase._leaking_threads_tests))
186
def _extractBenchmarkTime(self, testCase):
244
# We don't report the main thread as an active one.
246
'%d non-main threads were left active in the end.\n'
247
% (TestCase._active_threads - 1))
249
def getDescription(self, test):
252
def _extractBenchmarkTime(self, testCase, details=None):
187
253
"""Add a benchmark time for the current test case."""
254
if details and 'benchtime' in details:
255
return float(''.join(details['benchtime'].iter_bytes()))
188
256
return getattr(testCase, "_benchtime", None)
190
258
def _elapsedTestTimeString(self):
545
597
bench_history=None,
599
result_decorators=None,
601
"""Create a TextTestRunner.
603
:param result_decorators: An optional list of decorators to apply
604
to the result object being used by the runner. Decorators are
605
applied left to right - the first element in the list is the
608
# stream may know claim to know to write unicode strings, but in older
609
# pythons this goes sufficiently wrong that it is a bad idea. (
610
# specifically a built in file with encoding 'UTF-8' will still try
611
# to encode using ascii.
612
new_encoding = osutils.get_terminal_encoding()
613
codec = codecs.lookup(new_encoding)
614
if type(codec) is tuple:
618
encode = codec.encode
619
stream = osutils.UnicodeOrBytesToBytesWriter(encode, stream)
620
stream.encoding = new_encoding
549
621
self.stream = unittest._WritelnDecorator(stream)
550
622
self.descriptions = descriptions
551
623
self.verbosity = verbosity
552
624
self._bench_history = bench_history
553
self.list_only = list_only
554
625
self._strict = strict
626
self._result_decorators = result_decorators or []
556
628
def run(self, test):
557
629
"Run the given test case or test suite."
558
startTime = time.time()
559
630
if self.verbosity == 1:
560
631
result_class = TextTestResult
561
632
elif self.verbosity >= 2:
562
633
result_class = VerboseTestResult
563
result = result_class(self.stream,
634
original_result = result_class(self.stream,
564
635
self.descriptions,
566
637
bench_history=self._bench_history,
567
num_tests=test.countTestCases(),
568
638
strict=self._strict,
570
result.stop_early = self.stop_on_failure
571
result.report_starting()
573
if self.verbosity >= 2:
574
self.stream.writeln("Listing tests only ...\n")
576
for t in iter_suite_tests(test):
577
self.stream.writeln("%s" % (t.id()))
586
if isinstance(test, testtools.ConcurrentTestSuite):
587
# We need to catch bzr specific behaviors
588
test.run(BZRTransformingResult(result))
591
run = result.testsRun
593
stopTime = time.time()
594
timeTaken = stopTime - startTime
596
self.stream.writeln(result.separator2)
597
self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
598
run, run != 1 and "s" or "", timeTaken))
599
self.stream.writeln()
600
if not result.wasSuccessful():
601
self.stream.write("FAILED (")
602
failed, errored = map(len, (result.failures, result.errors))
604
self.stream.write("failures=%d" % failed)
606
if failed: self.stream.write(", ")
607
self.stream.write("errors=%d" % errored)
608
if result.known_failure_count:
609
if failed or errored: self.stream.write(", ")
610
self.stream.write("known_failure_count=%d" %
611
result.known_failure_count)
612
self.stream.writeln(")")
614
if result.known_failure_count:
615
self.stream.writeln("OK (known_failures=%d)" %
616
result.known_failure_count)
618
self.stream.writeln("OK")
619
if result.skip_count > 0:
620
skipped = result.skip_count
621
self.stream.writeln('%d test%s skipped' %
622
(skipped, skipped != 1 and "s" or ""))
623
if result.unsupported:
624
for feature, count in sorted(result.unsupported.items()):
625
self.stream.writeln("Missing feature '%s' skipped %d tests." %
640
# Signal to result objects that look at stop early policy to stop,
641
original_result.stop_early = self.stop_on_failure
642
result = original_result
643
for decorator in self._result_decorators:
644
result = decorator(result)
645
result.stop_early = self.stop_on_failure
646
result.startTestRun()
651
# higher level code uses our extended protocol to determine
652
# what exit code to give.
653
return original_result
631
656
def iter_suite_tests(suite):
841
876
# this hook should always be installed
842
877
request._install_hook()
879
def disable_directory_isolation(self):
880
"""Turn off directory isolation checks."""
881
self._directory_isolation = False
883
def enable_directory_isolation(self):
884
"""Enable directory isolation checks."""
885
self._directory_isolation = True
844
887
def _silenceUI(self):
845
888
"""Turn off UI for duration of test"""
846
889
# by default the UI is off; tests can turn it on if they want it.
847
saved = ui.ui_factory
849
ui.ui_factory = saved
850
ui.ui_factory = ui.SilentUIFactory()
851
self.addCleanup(_restore)
890
self.overrideAttr(ui, 'ui_factory', ui.SilentUIFactory())
892
def _check_locks(self):
893
"""Check that all lock take/release actions have been paired."""
894
# We always check for mismatched locks. If a mismatch is found, we
895
# fail unless -Edisable_lock_checks is supplied to selftest, in which
896
# case we just print a warning.
898
acquired_locks = [lock for action, lock in self._lock_actions
899
if action == 'acquired']
900
released_locks = [lock for action, lock in self._lock_actions
901
if action == 'released']
902
broken_locks = [lock for action, lock in self._lock_actions
903
if action == 'broken']
904
# trivially, given the tests for lock acquistion and release, if we
905
# have as many in each list, it should be ok. Some lock tests also
906
# break some locks on purpose and should be taken into account by
907
# considering that breaking a lock is just a dirty way of releasing it.
908
if len(acquired_locks) != (len(released_locks) + len(broken_locks)):
909
message = ('Different number of acquired and '
910
'released or broken locks. (%s, %s + %s)' %
911
(acquired_locks, released_locks, broken_locks))
912
if not self._lock_check_thorough:
913
# Rather than fail, just warn
914
print "Broken test %s: %s" % (self, message)
918
def _track_locks(self):
919
"""Track lock activity during tests."""
920
self._lock_actions = []
921
if 'disable_lock_checks' in selftest_debug_flags:
922
self._lock_check_thorough = False
924
self._lock_check_thorough = True
926
self.addCleanup(self._check_locks)
927
_mod_lock.Lock.hooks.install_named_hook('lock_acquired',
928
self._lock_acquired, None)
929
_mod_lock.Lock.hooks.install_named_hook('lock_released',
930
self._lock_released, None)
931
_mod_lock.Lock.hooks.install_named_hook('lock_broken',
932
self._lock_broken, None)
934
def _lock_acquired(self, result):
935
self._lock_actions.append(('acquired', result))
937
def _lock_released(self, result):
938
self._lock_actions.append(('released', result))
940
def _lock_broken(self, result):
941
self._lock_actions.append(('broken', result))
943
def permit_dir(self, name):
944
"""Permit a directory to be used by this test. See permit_url."""
945
name_transport = _mod_transport.get_transport(name)
946
self.permit_url(name)
947
self.permit_url(name_transport.base)
949
def permit_url(self, url):
950
"""Declare that url is an ok url to use in this test.
952
Do this for memory transports, temporary test directory etc.
954
Do not do this for the current working directory, /tmp, or any other
955
preexisting non isolated url.
957
if not url.endswith('/'):
959
self._bzr_selftest_roots.append(url)
961
def permit_source_tree_branch_repo(self):
962
"""Permit the source tree bzr is running from to be opened.
964
Some code such as bzrlib.version attempts to read from the bzr branch
965
that bzr is executing from (if any). This method permits that directory
966
to be used in the test suite.
968
path = self.get_source_path()
969
self.record_directory_isolation()
972
workingtree.WorkingTree.open(path)
973
except (errors.NotBranchError, errors.NoWorkingTree):
976
self.enable_directory_isolation()
978
def _preopen_isolate_transport(self, transport):
979
"""Check that all transport openings are done in the test work area."""
980
while isinstance(transport, pathfilter.PathFilteringTransport):
981
# Unwrap pathfiltered transports
982
transport = transport.server.backing_transport.clone(
983
transport._filter('.'))
985
# ReadonlySmartTCPServer_for_testing decorates the backing transport
986
# urls it is given by prepending readonly+. This is appropriate as the
987
# client shouldn't know that the server is readonly (or not readonly).
988
# We could register all servers twice, with readonly+ prepending, but
989
# that makes for a long list; this is about the same but easier to
991
if url.startswith('readonly+'):
992
url = url[len('readonly+'):]
993
self._preopen_isolate_url(url)
995
def _preopen_isolate_url(self, url):
996
if not self._directory_isolation:
998
if self._directory_isolation == 'record':
999
self._bzr_selftest_roots.append(url)
1001
# This prevents all transports, including e.g. sftp ones backed on disk
1002
# from working unless they are explicitly granted permission. We then
1003
# depend on the code that sets up test transports to check that they are
1004
# appropriately isolated and enable their use by calling
1005
# self.permit_transport()
1006
if not osutils.is_inside_any(self._bzr_selftest_roots, url):
1007
raise errors.BzrError("Attempt to escape test isolation: %r %r"
1008
% (url, self._bzr_selftest_roots))
1010
def record_directory_isolation(self):
1011
"""Gather accessed directories to permit later access.
1013
This is used for tests that access the branch bzr is running from.
1015
self._directory_isolation = "record"
1017
def start_server(self, transport_server, backing_server=None):
1018
"""Start transport_server for this test.
1020
This starts the server, registers a cleanup for it and permits the
1021
server's urls to be used.
1023
if backing_server is None:
1024
transport_server.start_server()
1026
transport_server.start_server(backing_server)
1027
self.addCleanup(transport_server.stop_server)
1028
# Obtain a real transport because if the server supplies a password, it
1029
# will be hidden from the base on the client side.
1030
t = _mod_transport.get_transport(transport_server.get_url())
1031
# Some transport servers effectively chroot the backing transport;
1032
# others like SFTPServer don't - users of the transport can walk up the
1033
# transport to read the entire backing transport. This wouldn't matter
1034
# except that the workdir tests are given - and that they expect the
1035
# server's url to point at - is one directory under the safety net. So
1036
# Branch operations into the transport will attempt to walk up one
1037
# directory. Chrooting all servers would avoid this but also mean that
1038
# we wouldn't be testing directly against non-root urls. Alternatively
1039
# getting the test framework to start the server with a backing server
1040
# at the actual safety net directory would work too, but this then
1041
# means that the self.get_url/self.get_transport methods would need
1042
# to transform all their results. On balance its cleaner to handle it
1043
# here, and permit a higher url when we have one of these transports.
1044
if t.base.endswith('/work/'):
1045
# we have safety net/test root/work
1046
t = t.clone('../..')
1047
elif isinstance(transport_server,
1048
test_server.SmartTCPServer_for_testing):
1049
# The smart server adds a path similar to work, which is traversed
1050
# up from by the client. But the server is chrooted - the actual
1051
# backing transport is not escaped from, and VFS requests to the
1052
# root will error (because they try to escape the chroot).
1054
while t2.base != t.base:
1057
self.permit_url(t.base)
1059
def _track_transports(self):
1060
"""Install checks for transport usage."""
1061
# TestCase has no safe place it can write to.
1062
self._bzr_selftest_roots = []
1063
# Currently the easiest way to be sure that nothing is going on is to
1064
# hook into bzr dir opening. This leaves a small window of error for
1065
# transport tests, but they are well known, and we can improve on this
1067
bzrdir.BzrDir.hooks.install_named_hook("pre_open",
1068
self._preopen_isolate_transport, "Check bzr directories are safe.")
853
1070
def _ndiff_strings(self, a, b):
854
1071
"""Return ndiff between two strings containing lines.
1317
1585
def _do_skip(self, result, reason):
1318
1586
addSkip = getattr(result, 'addSkip', None)
1319
1587
if not callable(addSkip):
1320
result.addError(self, sys.exc_info())
1588
result.addSuccess(result)
1322
1590
addSkip(self, reason)
1324
def run(self, result=None):
1325
if result is None: result = self.defaultTestResult()
1326
for feature in getattr(self, '_test_needs_features', []):
1327
if not feature.available():
1328
result.startTest(self)
1329
if getattr(result, 'addNotSupported', None):
1330
result.addNotSupported(self, feature)
1332
result.addSuccess(self)
1333
result.stopTest(self)
1337
result.startTest(self)
1338
absent_attr = object()
1340
method_name = getattr(self, '_testMethodName', absent_attr)
1341
if method_name is absent_attr:
1343
method_name = getattr(self, '_TestCase__testMethodName')
1344
testMethod = getattr(self, method_name)
1348
if not self._bzr_test_setUp_run:
1350
"test setUp did not invoke "
1351
"bzrlib.tests.TestCase's setUp")
1352
except KeyboardInterrupt:
1354
except TestSkipped, e:
1355
self._do_skip(result, e.args[0])
1359
result.addError(self, sys.exc_info())
1366
except self.failureException:
1367
result.addFailure(self, sys.exc_info())
1368
except TestSkipped, e:
1370
reason = "No reason given."
1373
self._do_skip(result, reason)
1374
except KeyboardInterrupt:
1377
result.addError(self, sys.exc_info())
1381
if not self._bzr_test_tearDown_run:
1383
"test tearDown did not invoke "
1384
"bzrlib.tests.TestCase's tearDown")
1385
except KeyboardInterrupt:
1388
result.addError(self, sys.exc_info())
1390
if ok: result.addSuccess(self)
1392
result.stopTest(self)
1394
except TestNotApplicable:
1395
# Not moved from the result [yet].
1397
except KeyboardInterrupt:
1401
absent_attr = object()
1402
for attr_name in self.attrs_to_keep:
1403
attr = getattr(self, attr_name, absent_attr)
1404
if attr is not absent_attr:
1405
saved_attrs[attr_name] = attr
1406
self.__dict__ = saved_attrs
1409
self._bzr_test_tearDown_run = True
1411
self._log_contents = ''
1412
unittest.TestCase.tearDown(self)
1593
def _do_known_failure(self, result, e):
1594
err = sys.exc_info()
1595
addExpectedFailure = getattr(result, 'addExpectedFailure', None)
1596
if addExpectedFailure is not None:
1597
addExpectedFailure(self, err)
1599
result.addSuccess(self)
1602
def _do_not_applicable(self, result, e):
1604
reason = 'No reason given'
1607
addNotApplicable = getattr(result, 'addNotApplicable', None)
1608
if addNotApplicable is not None:
1609
result.addNotApplicable(self, reason)
1611
self._do_skip(result, reason)
1614
def _do_unsupported_or_skip(self, result, e):
1616
addNotSupported = getattr(result, 'addNotSupported', None)
1617
if addNotSupported is not None:
1618
result.addNotSupported(self, reason)
1620
self._do_skip(result, reason)
1414
1622
def time(self, callable, *args, **kwargs):
1415
1623
"""Run callable and accrue the time it takes to the benchmark time.
3042
3354
def addSuccess(self, test):
3043
3355
self.result.addSuccess(test)
3045
def _error_looks_like(self, prefix, err):
3046
"""Deserialize exception and returns the stringify value."""
3050
if isinstance(exc, subunit.RemoteException):
3051
# stringify the exception gives access to the remote traceback
3052
# We search the last line for 'prefix'
3053
lines = str(exc).split('\n')
3054
while lines and not lines[-1]:
3057
if lines[-1].startswith(prefix):
3058
value = lines[-1][len(prefix):]
3357
def addError(self, test, err):
3358
self.result.addError(test, err)
3360
def addFailure(self, test, err):
3361
self.result.addFailure(test, err)
3362
ForwardingResult = testtools.ExtendedToOriginalDecorator
3365
class ProfileResult(ForwardingResult):
3366
"""Generate profiling data for all activity between start and success.
3368
The profile data is appended to the test's _benchcalls attribute and can
3369
be accessed by the forwarded-to TestResult.
3371
While it might be cleaner do accumulate this in stopTest, addSuccess is
3372
where our existing output support for lsprof is, and this class aims to
3373
fit in with that: while it could be moved it's not necessary to accomplish
3374
test profiling, nor would it be dramatically cleaner.
3377
def startTest(self, test):
3378
self.profiler = bzrlib.lsprof.BzrProfiler()
3379
# Prevent deadlocks in tests that use lsprof: those tests will
3381
bzrlib.lsprof.BzrProfiler.profiler_block = 0
3382
self.profiler.start()
3383
ForwardingResult.startTest(self, test)
3385
def addSuccess(self, test):
3386
stats = self.profiler.stop()
3388
calls = test._benchcalls
3389
except AttributeError:
3390
test._benchcalls = []
3391
calls = test._benchcalls
3392
calls.append(((test.id(), "", ""), stats))
3393
ForwardingResult.addSuccess(self, test)
3395
def stopTest(self, test):
3396
ForwardingResult.stopTest(self, test)
3397
self.profiler = None
3062
3400
# Controlled by "bzr selftest -E=..." option
3401
# Currently supported:
3402
# -Eallow_debug Will no longer clear debug.debug_flags() so it
3403
# preserves any flags supplied at the command line.
3404
# -Edisable_lock_checks Turns errors in mismatched locks into simple prints
3405
# rather than failing tests. And no longer raise
3406
# LockContention when fctnl locks are not being used
3407
# with proper exclusion rules.
3063
3408
selftest_debug_flags = set()
3277
3637
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
3640
def _test_suite_testmod_names():
3641
"""Return the standard list of test module names to test."""
3644
'bzrlib.tests.blackbox',
3645
'bzrlib.tests.commands',
3646
'bzrlib.tests.per_branch',
3647
'bzrlib.tests.per_bzrdir',
3648
'bzrlib.tests.per_bzrdir_colo',
3649
'bzrlib.tests.per_foreign_vcs',
3650
'bzrlib.tests.per_interrepository',
3651
'bzrlib.tests.per_intertree',
3652
'bzrlib.tests.per_inventory',
3653
'bzrlib.tests.per_interbranch',
3654
'bzrlib.tests.per_lock',
3655
'bzrlib.tests.per_merger',
3656
'bzrlib.tests.per_transport',
3657
'bzrlib.tests.per_tree',
3658
'bzrlib.tests.per_pack_repository',
3659
'bzrlib.tests.per_repository',
3660
'bzrlib.tests.per_repository_chk',
3661
'bzrlib.tests.per_repository_reference',
3662
'bzrlib.tests.per_uifactory',
3663
'bzrlib.tests.per_versionedfile',
3664
'bzrlib.tests.per_workingtree',
3665
'bzrlib.tests.test__annotator',
3666
'bzrlib.tests.test__bencode',
3667
'bzrlib.tests.test__chk_map',
3668
'bzrlib.tests.test__dirstate_helpers',
3669
'bzrlib.tests.test__groupcompress',
3670
'bzrlib.tests.test__known_graph',
3671
'bzrlib.tests.test__rio',
3672
'bzrlib.tests.test__simple_set',
3673
'bzrlib.tests.test__static_tuple',
3674
'bzrlib.tests.test__walkdirs_win32',
3675
'bzrlib.tests.test_ancestry',
3676
'bzrlib.tests.test_annotate',
3677
'bzrlib.tests.test_api',
3678
'bzrlib.tests.test_atomicfile',
3679
'bzrlib.tests.test_bad_files',
3680
'bzrlib.tests.test_bisect_multi',
3681
'bzrlib.tests.test_branch',
3682
'bzrlib.tests.test_branchbuilder',
3683
'bzrlib.tests.test_btree_index',
3684
'bzrlib.tests.test_bugtracker',
3685
'bzrlib.tests.test_bundle',
3686
'bzrlib.tests.test_bzrdir',
3687
'bzrlib.tests.test__chunks_to_lines',
3688
'bzrlib.tests.test_cache_utf8',
3689
'bzrlib.tests.test_chk_map',
3690
'bzrlib.tests.test_chk_serializer',
3691
'bzrlib.tests.test_chunk_writer',
3692
'bzrlib.tests.test_clean_tree',
3693
'bzrlib.tests.test_cleanup',
3694
'bzrlib.tests.test_cmdline',
3695
'bzrlib.tests.test_commands',
3696
'bzrlib.tests.test_commit',
3697
'bzrlib.tests.test_commit_merge',
3698
'bzrlib.tests.test_config',
3699
'bzrlib.tests.test_conflicts',
3700
'bzrlib.tests.test_counted_lock',
3701
'bzrlib.tests.test_crash',
3702
'bzrlib.tests.test_decorators',
3703
'bzrlib.tests.test_delta',
3704
'bzrlib.tests.test_debug',
3705
'bzrlib.tests.test_deprecated_graph',
3706
'bzrlib.tests.test_diff',
3707
'bzrlib.tests.test_directory_service',
3708
'bzrlib.tests.test_dirstate',
3709
'bzrlib.tests.test_email_message',
3710
'bzrlib.tests.test_eol_filters',
3711
'bzrlib.tests.test_errors',
3712
'bzrlib.tests.test_export',
3713
'bzrlib.tests.test_extract',
3714
'bzrlib.tests.test_fetch',
3715
'bzrlib.tests.test_fixtures',
3716
'bzrlib.tests.test_fifo_cache',
3717
'bzrlib.tests.test_filters',
3718
'bzrlib.tests.test_ftp_transport',
3719
'bzrlib.tests.test_foreign',
3720
'bzrlib.tests.test_generate_docs',
3721
'bzrlib.tests.test_generate_ids',
3722
'bzrlib.tests.test_globbing',
3723
'bzrlib.tests.test_gpg',
3724
'bzrlib.tests.test_graph',
3725
'bzrlib.tests.test_groupcompress',
3726
'bzrlib.tests.test_hashcache',
3727
'bzrlib.tests.test_help',
3728
'bzrlib.tests.test_hooks',
3729
'bzrlib.tests.test_http',
3730
'bzrlib.tests.test_http_response',
3731
'bzrlib.tests.test_https_ca_bundle',
3732
'bzrlib.tests.test_identitymap',
3733
'bzrlib.tests.test_ignores',
3734
'bzrlib.tests.test_index',
3735
'bzrlib.tests.test_import_tariff',
3736
'bzrlib.tests.test_info',
3737
'bzrlib.tests.test_inv',
3738
'bzrlib.tests.test_inventory_delta',
3739
'bzrlib.tests.test_knit',
3740
'bzrlib.tests.test_lazy_import',
3741
'bzrlib.tests.test_lazy_regex',
3742
'bzrlib.tests.test_library_state',
3743
'bzrlib.tests.test_lock',
3744
'bzrlib.tests.test_lockable_files',
3745
'bzrlib.tests.test_lockdir',
3746
'bzrlib.tests.test_log',
3747
'bzrlib.tests.test_lru_cache',
3748
'bzrlib.tests.test_lsprof',
3749
'bzrlib.tests.test_mail_client',
3750
'bzrlib.tests.test_matchers',
3751
'bzrlib.tests.test_memorytree',
3752
'bzrlib.tests.test_merge',
3753
'bzrlib.tests.test_merge3',
3754
'bzrlib.tests.test_merge_core',
3755
'bzrlib.tests.test_merge_directive',
3756
'bzrlib.tests.test_missing',
3757
'bzrlib.tests.test_msgeditor',
3758
'bzrlib.tests.test_multiparent',
3759
'bzrlib.tests.test_mutabletree',
3760
'bzrlib.tests.test_nonascii',
3761
'bzrlib.tests.test_options',
3762
'bzrlib.tests.test_osutils',
3763
'bzrlib.tests.test_osutils_encodings',
3764
'bzrlib.tests.test_pack',
3765
'bzrlib.tests.test_patch',
3766
'bzrlib.tests.test_patches',
3767
'bzrlib.tests.test_permissions',
3768
'bzrlib.tests.test_plugins',
3769
'bzrlib.tests.test_progress',
3770
'bzrlib.tests.test_read_bundle',
3771
'bzrlib.tests.test_reconcile',
3772
'bzrlib.tests.test_reconfigure',
3773
'bzrlib.tests.test_registry',
3774
'bzrlib.tests.test_remote',
3775
'bzrlib.tests.test_rename_map',
3776
'bzrlib.tests.test_repository',
3777
'bzrlib.tests.test_revert',
3778
'bzrlib.tests.test_revision',
3779
'bzrlib.tests.test_revisionspec',
3780
'bzrlib.tests.test_revisiontree',
3781
'bzrlib.tests.test_rio',
3782
'bzrlib.tests.test_rules',
3783
'bzrlib.tests.test_sampler',
3784
'bzrlib.tests.test_script',
3785
'bzrlib.tests.test_selftest',
3786
'bzrlib.tests.test_serializer',
3787
'bzrlib.tests.test_setup',
3788
'bzrlib.tests.test_sftp_transport',
3789
'bzrlib.tests.test_shelf',
3790
'bzrlib.tests.test_shelf_ui',
3791
'bzrlib.tests.test_smart',
3792
'bzrlib.tests.test_smart_add',
3793
'bzrlib.tests.test_smart_request',
3794
'bzrlib.tests.test_smart_transport',
3795
'bzrlib.tests.test_smtp_connection',
3796
'bzrlib.tests.test_source',
3797
'bzrlib.tests.test_ssh_transport',
3798
'bzrlib.tests.test_status',
3799
'bzrlib.tests.test_store',
3800
'bzrlib.tests.test_strace',
3801
'bzrlib.tests.test_subsume',
3802
'bzrlib.tests.test_switch',
3803
'bzrlib.tests.test_symbol_versioning',
3804
'bzrlib.tests.test_tag',
3805
'bzrlib.tests.test_testament',
3806
'bzrlib.tests.test_textfile',
3807
'bzrlib.tests.test_textmerge',
3808
'bzrlib.tests.test_timestamp',
3809
'bzrlib.tests.test_trace',
3810
'bzrlib.tests.test_transactions',
3811
'bzrlib.tests.test_transform',
3812
'bzrlib.tests.test_transport',
3813
'bzrlib.tests.test_transport_log',
3814
'bzrlib.tests.test_tree',
3815
'bzrlib.tests.test_treebuilder',
3816
'bzrlib.tests.test_tsort',
3817
'bzrlib.tests.test_tuned_gzip',
3818
'bzrlib.tests.test_ui',
3819
'bzrlib.tests.test_uncommit',
3820
'bzrlib.tests.test_upgrade',
3821
'bzrlib.tests.test_upgrade_stacked',
3822
'bzrlib.tests.test_urlutils',
3823
'bzrlib.tests.test_version',
3824
'bzrlib.tests.test_version_info',
3825
'bzrlib.tests.test_weave',
3826
'bzrlib.tests.test_whitebox',
3827
'bzrlib.tests.test_win32utils',
3828
'bzrlib.tests.test_workingtree',
3829
'bzrlib.tests.test_workingtree_4',
3830
'bzrlib.tests.test_wsgi',
3831
'bzrlib.tests.test_xml',
3835
def _test_suite_modules_to_doctest():
3836
"""Return the list of modules to doctest."""
3838
# GZ 2009-03-31: No docstrings with -OO so there's nothing to doctest
3842
'bzrlib.branchbuilder',
3843
'bzrlib.decorators',
3846
'bzrlib.iterablefile',
3850
'bzrlib.symbol_versioning',
3852
'bzrlib.tests.fixtures',
3854
'bzrlib.version_info_formats.format_custom',
3280
3858
def test_suite(keep_only=None, starting_with=None):
3281
3859
"""Build and return TestSuite for the whole of bzrlib.
3288
3866
This function can be replaced if you need to change the default test
3289
3867
suite on a global basis, but it is not encouraged.
3293
'bzrlib.tests.blackbox',
3294
'bzrlib.tests.branch_implementations',
3295
'bzrlib.tests.bzrdir_implementations',
3296
'bzrlib.tests.commands',
3297
'bzrlib.tests.interrepository_implementations',
3298
'bzrlib.tests.intertree_implementations',
3299
'bzrlib.tests.inventory_implementations',
3300
'bzrlib.tests.per_interbranch',
3301
'bzrlib.tests.per_lock',
3302
'bzrlib.tests.per_repository',
3303
'bzrlib.tests.per_repository_chk',
3304
'bzrlib.tests.per_repository_reference',
3305
'bzrlib.tests.test__chk_map',
3306
'bzrlib.tests.test__dirstate_helpers',
3307
'bzrlib.tests.test__groupcompress',
3308
'bzrlib.tests.test__walkdirs_win32',
3309
'bzrlib.tests.test_ancestry',
3310
'bzrlib.tests.test_annotate',
3311
'bzrlib.tests.test_api',
3312
'bzrlib.tests.test_atomicfile',
3313
'bzrlib.tests.test_bad_files',
3314
'bzrlib.tests.test_bisect_multi',
3315
'bzrlib.tests.test_branch',
3316
'bzrlib.tests.test_branchbuilder',
3317
'bzrlib.tests.test_btree_index',
3318
'bzrlib.tests.test_bugtracker',
3319
'bzrlib.tests.test_bundle',
3320
'bzrlib.tests.test_bzrdir',
3321
'bzrlib.tests.test__chunks_to_lines',
3322
'bzrlib.tests.test_cache_utf8',
3323
'bzrlib.tests.test_chk_map',
3324
'bzrlib.tests.test_chunk_writer',
3325
'bzrlib.tests.test_clean_tree',
3326
'bzrlib.tests.test_commands',
3327
'bzrlib.tests.test_commit',
3328
'bzrlib.tests.test_commit_merge',
3329
'bzrlib.tests.test_config',
3330
'bzrlib.tests.test_conflicts',
3331
'bzrlib.tests.test_counted_lock',
3332
'bzrlib.tests.test_decorators',
3333
'bzrlib.tests.test_delta',
3334
'bzrlib.tests.test_debug',
3335
'bzrlib.tests.test_deprecated_graph',
3336
'bzrlib.tests.test_diff',
3337
'bzrlib.tests.test_directory_service',
3338
'bzrlib.tests.test_dirstate',
3339
'bzrlib.tests.test_email_message',
3340
'bzrlib.tests.test_eol_filters',
3341
'bzrlib.tests.test_errors',
3342
'bzrlib.tests.test_export',
3343
'bzrlib.tests.test_extract',
3344
'bzrlib.tests.test_fetch',
3345
'bzrlib.tests.test_fifo_cache',
3346
'bzrlib.tests.test_filters',
3347
'bzrlib.tests.test_ftp_transport',
3348
'bzrlib.tests.test_foreign',
3349
'bzrlib.tests.test_generate_docs',
3350
'bzrlib.tests.test_generate_ids',
3351
'bzrlib.tests.test_globbing',
3352
'bzrlib.tests.test_gpg',
3353
'bzrlib.tests.test_graph',
3354
'bzrlib.tests.test_groupcompress',
3355
'bzrlib.tests.test_hashcache',
3356
'bzrlib.tests.test_help',
3357
'bzrlib.tests.test_hooks',
3358
'bzrlib.tests.test_http',
3359
'bzrlib.tests.test_http_implementations',
3360
'bzrlib.tests.test_http_response',
3361
'bzrlib.tests.test_https_ca_bundle',
3362
'bzrlib.tests.test_identitymap',
3363
'bzrlib.tests.test_ignores',
3364
'bzrlib.tests.test_index',
3365
'bzrlib.tests.test_info',
3366
'bzrlib.tests.test_inv',
3367
'bzrlib.tests.test_inventory_delta',
3368
'bzrlib.tests.test_knit',
3369
'bzrlib.tests.test_lazy_import',
3370
'bzrlib.tests.test_lazy_regex',
3371
'bzrlib.tests.test_lockable_files',
3372
'bzrlib.tests.test_lockdir',
3373
'bzrlib.tests.test_log',
3374
'bzrlib.tests.test_lru_cache',
3375
'bzrlib.tests.test_lsprof',
3376
'bzrlib.tests.test_mail_client',
3377
'bzrlib.tests.test_memorytree',
3378
'bzrlib.tests.test_merge',
3379
'bzrlib.tests.test_merge3',
3380
'bzrlib.tests.test_merge_core',
3381
'bzrlib.tests.test_merge_directive',
3382
'bzrlib.tests.test_missing',
3383
'bzrlib.tests.test_msgeditor',
3384
'bzrlib.tests.test_multiparent',
3385
'bzrlib.tests.test_mutabletree',
3386
'bzrlib.tests.test_nonascii',
3387
'bzrlib.tests.test_options',
3388
'bzrlib.tests.test_osutils',
3389
'bzrlib.tests.test_osutils_encodings',
3390
'bzrlib.tests.test_pack',
3391
'bzrlib.tests.test_pack_repository',
3392
'bzrlib.tests.test_patch',
3393
'bzrlib.tests.test_patches',
3394
'bzrlib.tests.test_permissions',
3395
'bzrlib.tests.test_plugins',
3396
'bzrlib.tests.test_progress',
3397
'bzrlib.tests.test_read_bundle',
3398
'bzrlib.tests.test_reconcile',
3399
'bzrlib.tests.test_reconfigure',
3400
'bzrlib.tests.test_registry',
3401
'bzrlib.tests.test_remote',
3402
'bzrlib.tests.test_rename_map',
3403
'bzrlib.tests.test_repository',
3404
'bzrlib.tests.test_revert',
3405
'bzrlib.tests.test_revision',
3406
'bzrlib.tests.test_revisionspec',
3407
'bzrlib.tests.test_revisiontree',
3408
'bzrlib.tests.test_rio',
3409
'bzrlib.tests.test_rules',
3410
'bzrlib.tests.test_sampler',
3411
'bzrlib.tests.test_selftest',
3412
'bzrlib.tests.test_serializer',
3413
'bzrlib.tests.test_setup',
3414
'bzrlib.tests.test_sftp_transport',
3415
'bzrlib.tests.test_shelf',
3416
'bzrlib.tests.test_shelf_ui',
3417
'bzrlib.tests.test_smart',
3418
'bzrlib.tests.test_smart_add',
3419
'bzrlib.tests.test_smart_request',
3420
'bzrlib.tests.test_smart_transport',
3421
'bzrlib.tests.test_smtp_connection',
3422
'bzrlib.tests.test_source',
3423
'bzrlib.tests.test_ssh_transport',
3424
'bzrlib.tests.test_status',
3425
'bzrlib.tests.test_store',
3426
'bzrlib.tests.test_strace',
3427
'bzrlib.tests.test_subsume',
3428
'bzrlib.tests.test_switch',
3429
'bzrlib.tests.test_symbol_versioning',
3430
'bzrlib.tests.test_tag',
3431
'bzrlib.tests.test_testament',
3432
'bzrlib.tests.test_textfile',
3433
'bzrlib.tests.test_textmerge',
3434
'bzrlib.tests.test_timestamp',
3435
'bzrlib.tests.test_trace',
3436
'bzrlib.tests.test_transactions',
3437
'bzrlib.tests.test_transform',
3438
'bzrlib.tests.test_transport',
3439
'bzrlib.tests.test_transport_implementations',
3440
'bzrlib.tests.test_transport_log',
3441
'bzrlib.tests.test_tree',
3442
'bzrlib.tests.test_treebuilder',
3443
'bzrlib.tests.test_tsort',
3444
'bzrlib.tests.test_tuned_gzip',
3445
'bzrlib.tests.test_ui',
3446
'bzrlib.tests.test_uncommit',
3447
'bzrlib.tests.test_upgrade',
3448
'bzrlib.tests.test_upgrade_stacked',
3449
'bzrlib.tests.test_urlutils',
3450
'bzrlib.tests.test_version',
3451
'bzrlib.tests.test_version_info',
3452
'bzrlib.tests.test_versionedfile',
3453
'bzrlib.tests.test_weave',
3454
'bzrlib.tests.test_whitebox',
3455
'bzrlib.tests.test_win32utils',
3456
'bzrlib.tests.test_workingtree',
3457
'bzrlib.tests.test_workingtree_4',
3458
'bzrlib.tests.test_wsgi',
3459
'bzrlib.tests.test_xml',
3460
'bzrlib.tests.tree_implementations',
3461
'bzrlib.tests.workingtree_implementations',
3462
'bzrlib.util.tests.test_bencode',
3465
3870
loader = TestUtil.TestLoader()
3872
if keep_only is not None:
3873
id_filter = TestIdList(keep_only)
3467
3874
if starting_with:
3468
starting_with = [test_prefix_alias_registry.resolve_alias(start)
3469
for start in starting_with]
3470
3875
# We take precedence over keep_only because *at loading time* using
3471
3876
# both options means we will load less tests for the same final result.
3472
3877
def interesting_module(name):
3778
4208
UnicodeFilenameFeature = _UnicodeFilenameFeature()
4211
class _CompatabilityThunkFeature(Feature):
4212
"""This feature is just a thunk to another feature.
4214
It issues a deprecation warning if it is accessed, to let you know that you
4215
should really use a different feature.
4218
def __init__(self, dep_version, module, name,
4219
replacement_name, replacement_module=None):
4220
super(_CompatabilityThunkFeature, self).__init__()
4221
self._module = module
4222
if replacement_module is None:
4223
replacement_module = module
4224
self._replacement_module = replacement_module
4226
self._replacement_name = replacement_name
4227
self._dep_version = dep_version
4228
self._feature = None
4231
if self._feature is None:
4232
depr_msg = self._dep_version % ('%s.%s'
4233
% (self._module, self._name))
4234
use_msg = ' Use %s.%s instead.' % (self._replacement_module,
4235
self._replacement_name)
4236
symbol_versioning.warn(depr_msg + use_msg, DeprecationWarning)
4237
# Import the new feature and use it as a replacement for the
4239
mod = __import__(self._replacement_module, {}, {},
4240
[self._replacement_name])
4241
self._feature = getattr(mod, self._replacement_name)
4245
return self._feature._probe()
4248
class ModuleAvailableFeature(Feature):
4249
"""This is a feature than describes a module we want to be available.
4251
Declare the name of the module in __init__(), and then after probing, the
4252
module will be available as 'self.module'.
4254
:ivar module: The module if it is available, else None.
4257
def __init__(self, module_name):
4258
super(ModuleAvailableFeature, self).__init__()
4259
self.module_name = module_name
4263
self._module = __import__(self.module_name, {}, {}, [''])
4270
if self.available(): # Make sure the probe has been done
4274
def feature_name(self):
4275
return self.module_name
4278
# This is kept here for compatibility, it is recommended to use
4279
# 'bzrlib.tests.feature.paramiko' instead
4280
ParamikoFeature = _CompatabilityThunkFeature(
4281
deprecated_in((2,1,0)),
4282
'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
3781
4285
def probe_unicode_in_user_encoding():
3782
4286
"""Try to encode several unicode strings to use in unicode-aware tests.
3783
4287
Return first successfull match.