196
168
self._overall_start_time = time.time()
197
169
self._strict = strict
199
def stopTestRun(self):
202
stopTime = time.time()
203
timeTaken = stopTime - self.startTime
205
self.stream.writeln(self.separator2)
206
self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
207
run, run != 1 and "s" or "", timeTaken))
208
self.stream.writeln()
209
if not self.wasSuccessful():
210
self.stream.write("FAILED (")
211
failed, errored = map(len, (self.failures, self.errors))
213
self.stream.write("failures=%d" % failed)
215
if failed: self.stream.write(", ")
216
self.stream.write("errors=%d" % errored)
217
if self.known_failure_count:
218
if failed or errored: self.stream.write(", ")
219
self.stream.write("known_failure_count=%d" %
220
self.known_failure_count)
221
self.stream.writeln(")")
223
if self.known_failure_count:
224
self.stream.writeln("OK (known_failures=%d)" %
225
self.known_failure_count)
227
self.stream.writeln("OK")
228
if self.skip_count > 0:
229
skipped = self.skip_count
230
self.stream.writeln('%d test%s skipped' %
231
(skipped, skipped != 1 and "s" or ""))
233
for feature, count in sorted(self.unsupported.items()):
234
self.stream.writeln("Missing feature '%s' skipped %d tests." %
237
173
ok = self.wasStrictlySuccessful()
239
175
ok = self.wasSuccessful()
177
self.stream.write('tests passed\n')
179
self.stream.write('tests failed\n')
240
180
if TestCase._first_thread_leaker_id:
241
181
self.stream.write(
242
182
'%s is leaking threads among %d leaking tests.\n' % (
243
183
TestCase._first_thread_leaker_id,
244
184
TestCase._leaking_threads_tests))
245
# We don't report the main thread as an active one.
247
'%d non-main threads were left active in the end.\n'
248
% (TestCase._active_threads - 1))
250
def getDescription(self, test):
253
def _extractBenchmarkTime(self, testCase, details=None):
186
def _extractBenchmarkTime(self, testCase):
254
187
"""Add a benchmark time for the current test case."""
255
if details and 'benchtime' in details:
256
return float(''.join(details['benchtime'].iter_bytes()))
257
188
return getattr(testCase, "_benchtime", None)
259
190
def _elapsedTestTimeString(self):
598
545
bench_history=None,
600
result_decorators=None,
602
"""Create a TextTestRunner.
604
:param result_decorators: An optional list of decorators to apply
605
to the result object being used by the runner. Decorators are
606
applied left to right - the first element in the list is the
609
# stream may know claim to know to write unicode strings, but in older
610
# pythons this goes sufficiently wrong that it is a bad idea. (
611
# specifically a built in file with encoding 'UTF-8' will still try
612
# to encode using ascii.
613
new_encoding = osutils.get_terminal_encoding()
614
codec = codecs.lookup(new_encoding)
615
if type(codec) is tuple:
619
encode = codec.encode
620
stream = osutils.UnicodeOrBytesToBytesWriter(encode, stream)
621
stream.encoding = new_encoding
622
549
self.stream = unittest._WritelnDecorator(stream)
623
550
self.descriptions = descriptions
624
551
self.verbosity = verbosity
625
552
self._bench_history = bench_history
553
self.list_only = list_only
626
554
self._strict = strict
627
self._result_decorators = result_decorators or []
629
556
def run(self, test):
630
557
"Run the given test case or test suite."
558
startTime = time.time()
631
559
if self.verbosity == 1:
632
560
result_class = TextTestResult
633
561
elif self.verbosity >= 2:
634
562
result_class = VerboseTestResult
635
original_result = result_class(self.stream,
563
result = result_class(self.stream,
636
564
self.descriptions,
638
566
bench_history=self._bench_history,
567
num_tests=test.countTestCases(),
639
568
strict=self._strict,
641
# Signal to result objects that look at stop early policy to stop,
642
original_result.stop_early = self.stop_on_failure
643
result = original_result
644
for decorator in self._result_decorators:
645
result = decorator(result)
646
result.stop_early = self.stop_on_failure
647
result.startTestRun()
652
# higher level code uses our extended protocol to determine
653
# what exit code to give.
654
return original_result
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." %
657
631
def iter_suite_tests(suite):
877
841
# this hook should always be installed
878
842
request._install_hook()
880
def disable_directory_isolation(self):
881
"""Turn off directory isolation checks."""
882
self._directory_isolation = False
884
def enable_directory_isolation(self):
885
"""Enable directory isolation checks."""
886
self._directory_isolation = True
888
844
def _silenceUI(self):
889
845
"""Turn off UI for duration of test"""
890
846
# by default the UI is off; tests can turn it on if they want it.
891
self.overrideAttr(ui, 'ui_factory', ui.SilentUIFactory())
893
def _check_locks(self):
894
"""Check that all lock take/release actions have been paired."""
895
# We always check for mismatched locks. If a mismatch is found, we
896
# fail unless -Edisable_lock_checks is supplied to selftest, in which
897
# case we just print a warning.
899
acquired_locks = [lock for action, lock in self._lock_actions
900
if action == 'acquired']
901
released_locks = [lock for action, lock in self._lock_actions
902
if action == 'released']
903
broken_locks = [lock for action, lock in self._lock_actions
904
if action == 'broken']
905
# trivially, given the tests for lock acquistion and release, if we
906
# have as many in each list, it should be ok. Some lock tests also
907
# break some locks on purpose and should be taken into account by
908
# considering that breaking a lock is just a dirty way of releasing it.
909
if len(acquired_locks) != (len(released_locks) + len(broken_locks)):
910
message = ('Different number of acquired and '
911
'released or broken locks. (%s, %s + %s)' %
912
(acquired_locks, released_locks, broken_locks))
913
if not self._lock_check_thorough:
914
# Rather than fail, just warn
915
print "Broken test %s: %s" % (self, message)
919
def _track_locks(self):
920
"""Track lock activity during tests."""
921
self._lock_actions = []
922
if 'disable_lock_checks' in selftest_debug_flags:
923
self._lock_check_thorough = False
925
self._lock_check_thorough = True
927
self.addCleanup(self._check_locks)
928
_mod_lock.Lock.hooks.install_named_hook('lock_acquired',
929
self._lock_acquired, None)
930
_mod_lock.Lock.hooks.install_named_hook('lock_released',
931
self._lock_released, None)
932
_mod_lock.Lock.hooks.install_named_hook('lock_broken',
933
self._lock_broken, None)
935
def _lock_acquired(self, result):
936
self._lock_actions.append(('acquired', result))
938
def _lock_released(self, result):
939
self._lock_actions.append(('released', result))
941
def _lock_broken(self, result):
942
self._lock_actions.append(('broken', result))
944
def permit_dir(self, name):
945
"""Permit a directory to be used by this test. See permit_url."""
946
name_transport = get_transport(name)
947
self.permit_url(name)
948
self.permit_url(name_transport.base)
950
def permit_url(self, url):
951
"""Declare that url is an ok url to use in this test.
953
Do this for memory transports, temporary test directory etc.
955
Do not do this for the current working directory, /tmp, or any other
956
preexisting non isolated url.
958
if not url.endswith('/'):
960
self._bzr_selftest_roots.append(url)
962
def permit_source_tree_branch_repo(self):
963
"""Permit the source tree bzr is running from to be opened.
965
Some code such as bzrlib.version attempts to read from the bzr branch
966
that bzr is executing from (if any). This method permits that directory
967
to be used in the test suite.
969
path = self.get_source_path()
970
self.record_directory_isolation()
973
workingtree.WorkingTree.open(path)
974
except (errors.NotBranchError, errors.NoWorkingTree):
977
self.enable_directory_isolation()
979
def _preopen_isolate_transport(self, transport):
980
"""Check that all transport openings are done in the test work area."""
981
while isinstance(transport, pathfilter.PathFilteringTransport):
982
# Unwrap pathfiltered transports
983
transport = transport.server.backing_transport.clone(
984
transport._filter('.'))
986
# ReadonlySmartTCPServer_for_testing decorates the backing transport
987
# urls it is given by prepending readonly+. This is appropriate as the
988
# client shouldn't know that the server is readonly (or not readonly).
989
# We could register all servers twice, with readonly+ prepending, but
990
# that makes for a long list; this is about the same but easier to
992
if url.startswith('readonly+'):
993
url = url[len('readonly+'):]
994
self._preopen_isolate_url(url)
996
def _preopen_isolate_url(self, url):
997
if not self._directory_isolation:
999
if self._directory_isolation == 'record':
1000
self._bzr_selftest_roots.append(url)
1002
# This prevents all transports, including e.g. sftp ones backed on disk
1003
# from working unless they are explicitly granted permission. We then
1004
# depend on the code that sets up test transports to check that they are
1005
# appropriately isolated and enable their use by calling
1006
# self.permit_transport()
1007
if not osutils.is_inside_any(self._bzr_selftest_roots, url):
1008
raise errors.BzrError("Attempt to escape test isolation: %r %r"
1009
% (url, self._bzr_selftest_roots))
1011
def record_directory_isolation(self):
1012
"""Gather accessed directories to permit later access.
1014
This is used for tests that access the branch bzr is running from.
1016
self._directory_isolation = "record"
1018
def start_server(self, transport_server, backing_server=None):
1019
"""Start transport_server for this test.
1021
This starts the server, registers a cleanup for it and permits the
1022
server's urls to be used.
1024
if backing_server is None:
1025
transport_server.start_server()
1027
transport_server.start_server(backing_server)
1028
self.addCleanup(transport_server.stop_server)
1029
# Obtain a real transport because if the server supplies a password, it
1030
# will be hidden from the base on the client side.
1031
t = get_transport(transport_server.get_url())
1032
# Some transport servers effectively chroot the backing transport;
1033
# others like SFTPServer don't - users of the transport can walk up the
1034
# transport to read the entire backing transport. This wouldn't matter
1035
# except that the workdir tests are given - and that they expect the
1036
# server's url to point at - is one directory under the safety net. So
1037
# Branch operations into the transport will attempt to walk up one
1038
# directory. Chrooting all servers would avoid this but also mean that
1039
# we wouldn't be testing directly against non-root urls. Alternatively
1040
# getting the test framework to start the server with a backing server
1041
# at the actual safety net directory would work too, but this then
1042
# means that the self.get_url/self.get_transport methods would need
1043
# to transform all their results. On balance its cleaner to handle it
1044
# here, and permit a higher url when we have one of these transports.
1045
if t.base.endswith('/work/'):
1046
# we have safety net/test root/work
1047
t = t.clone('../..')
1048
elif isinstance(transport_server,
1049
test_server.SmartTCPServer_for_testing):
1050
# The smart server adds a path similar to work, which is traversed
1051
# up from by the client. But the server is chrooted - the actual
1052
# backing transport is not escaped from, and VFS requests to the
1053
# root will error (because they try to escape the chroot).
1055
while t2.base != t.base:
1058
self.permit_url(t.base)
1060
def _track_transports(self):
1061
"""Install checks for transport usage."""
1062
# TestCase has no safe place it can write to.
1063
self._bzr_selftest_roots = []
1064
# Currently the easiest way to be sure that nothing is going on is to
1065
# hook into bzr dir opening. This leaves a small window of error for
1066
# transport tests, but they are well known, and we can improve on this
1068
bzrdir.BzrDir.hooks.install_named_hook("pre_open",
1069
self._preopen_isolate_transport, "Check bzr directories are safe.")
847
saved = ui.ui_factory
849
ui.ui_factory = saved
850
ui.ui_factory = ui.SilentUIFactory()
851
self.addCleanup(_restore)
1071
853
def _ndiff_strings(self, a, b):
1072
854
"""Return ndiff between two strings containing lines.
1586
1317
def _do_skip(self, result, reason):
1587
1318
addSkip = getattr(result, 'addSkip', None)
1588
1319
if not callable(addSkip):
1589
result.addSuccess(result)
1320
result.addError(self, sys.exc_info())
1591
1322
addSkip(self, reason)
1594
def _do_known_failure(self, result, e):
1595
err = sys.exc_info()
1596
addExpectedFailure = getattr(result, 'addExpectedFailure', None)
1597
if addExpectedFailure is not None:
1598
addExpectedFailure(self, err)
1600
result.addSuccess(self)
1603
def _do_not_applicable(self, result, e):
1605
reason = 'No reason given'
1608
addNotApplicable = getattr(result, 'addNotApplicable', None)
1609
if addNotApplicable is not None:
1610
result.addNotApplicable(self, reason)
1612
self._do_skip(result, reason)
1615
def _do_unsupported_or_skip(self, result, e):
1617
addNotSupported = getattr(result, 'addNotSupported', None)
1618
if addNotSupported is not None:
1619
result.addNotSupported(self, reason)
1621
self._do_skip(result, 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)
1623
1414
def time(self, callable, *args, **kwargs):
1624
1415
"""Run callable and accrue the time it takes to the benchmark time.
3346
3042
def addSuccess(self, test):
3347
3043
self.result.addSuccess(test)
3349
def addError(self, test, err):
3350
self.result.addError(test, err)
3352
def addFailure(self, test, err):
3353
self.result.addFailure(test, err)
3354
ForwardingResult = testtools.ExtendedToOriginalDecorator
3357
class ProfileResult(ForwardingResult):
3358
"""Generate profiling data for all activity between start and success.
3360
The profile data is appended to the test's _benchcalls attribute and can
3361
be accessed by the forwarded-to TestResult.
3363
While it might be cleaner do accumulate this in stopTest, addSuccess is
3364
where our existing output support for lsprof is, and this class aims to
3365
fit in with that: while it could be moved it's not necessary to accomplish
3366
test profiling, nor would it be dramatically cleaner.
3369
def startTest(self, test):
3370
self.profiler = bzrlib.lsprof.BzrProfiler()
3371
self.profiler.start()
3372
ForwardingResult.startTest(self, test)
3374
def addSuccess(self, test):
3375
stats = self.profiler.stop()
3377
calls = test._benchcalls
3378
except AttributeError:
3379
test._benchcalls = []
3380
calls = test._benchcalls
3381
calls.append(((test.id(), "", ""), stats))
3382
ForwardingResult.addSuccess(self, test)
3384
def stopTest(self, test):
3385
ForwardingResult.stopTest(self, test)
3386
self.profiler = None
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):]
3389
3062
# Controlled by "bzr selftest -E=..." option
3390
# Currently supported:
3391
# -Eallow_debug Will no longer clear debug.debug_flags() so it
3392
# preserves any flags supplied at the command line.
3393
# -Edisable_lock_checks Turns errors in mismatched locks into simple prints
3394
# rather than failing tests. And no longer raise
3395
# LockContention when fctnl locks are not being used
3396
# with proper exclusion rules.
3397
3063
selftest_debug_flags = set()
3626
3277
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
3629
def _test_suite_testmod_names():
3630
"""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_memorytree',
3738
'bzrlib.tests.test_merge',
3739
'bzrlib.tests.test_merge3',
3740
'bzrlib.tests.test_merge_core',
3741
'bzrlib.tests.test_merge_directive',
3742
'bzrlib.tests.test_missing',
3743
'bzrlib.tests.test_msgeditor',
3744
'bzrlib.tests.test_multiparent',
3745
'bzrlib.tests.test_mutabletree',
3746
'bzrlib.tests.test_nonascii',
3747
'bzrlib.tests.test_options',
3748
'bzrlib.tests.test_osutils',
3749
'bzrlib.tests.test_osutils_encodings',
3750
'bzrlib.tests.test_pack',
3751
'bzrlib.tests.test_patch',
3752
'bzrlib.tests.test_patches',
3753
'bzrlib.tests.test_permissions',
3754
'bzrlib.tests.test_plugins',
3755
'bzrlib.tests.test_progress',
3756
'bzrlib.tests.test_read_bundle',
3757
'bzrlib.tests.test_reconcile',
3758
'bzrlib.tests.test_reconfigure',
3759
'bzrlib.tests.test_registry',
3760
'bzrlib.tests.test_remote',
3761
'bzrlib.tests.test_rename_map',
3762
'bzrlib.tests.test_repository',
3763
'bzrlib.tests.test_revert',
3764
'bzrlib.tests.test_revision',
3765
'bzrlib.tests.test_revisionspec',
3766
'bzrlib.tests.test_revisiontree',
3767
'bzrlib.tests.test_rio',
3768
'bzrlib.tests.test_rules',
3769
'bzrlib.tests.test_sampler',
3770
'bzrlib.tests.test_script',
3771
'bzrlib.tests.test_selftest',
3772
'bzrlib.tests.test_serializer',
3773
'bzrlib.tests.test_setup',
3774
'bzrlib.tests.test_sftp_transport',
3775
'bzrlib.tests.test_shelf',
3776
'bzrlib.tests.test_shelf_ui',
3777
'bzrlib.tests.test_smart',
3778
'bzrlib.tests.test_smart_add',
3779
'bzrlib.tests.test_smart_request',
3780
'bzrlib.tests.test_smart_transport',
3781
'bzrlib.tests.test_smtp_connection',
3782
'bzrlib.tests.test_source',
3783
'bzrlib.tests.test_ssh_transport',
3784
'bzrlib.tests.test_status',
3785
'bzrlib.tests.test_store',
3786
'bzrlib.tests.test_strace',
3787
'bzrlib.tests.test_subsume',
3788
'bzrlib.tests.test_switch',
3789
'bzrlib.tests.test_symbol_versioning',
3790
'bzrlib.tests.test_tag',
3791
'bzrlib.tests.test_testament',
3792
'bzrlib.tests.test_textfile',
3793
'bzrlib.tests.test_textmerge',
3794
'bzrlib.tests.test_timestamp',
3795
'bzrlib.tests.test_trace',
3796
'bzrlib.tests.test_transactions',
3797
'bzrlib.tests.test_transform',
3798
'bzrlib.tests.test_transport',
3799
'bzrlib.tests.test_transport_log',
3800
'bzrlib.tests.test_tree',
3801
'bzrlib.tests.test_treebuilder',
3802
'bzrlib.tests.test_tsort',
3803
'bzrlib.tests.test_tuned_gzip',
3804
'bzrlib.tests.test_ui',
3805
'bzrlib.tests.test_uncommit',
3806
'bzrlib.tests.test_upgrade',
3807
'bzrlib.tests.test_upgrade_stacked',
3808
'bzrlib.tests.test_urlutils',
3809
'bzrlib.tests.test_version',
3810
'bzrlib.tests.test_version_info',
3811
'bzrlib.tests.test_weave',
3812
'bzrlib.tests.test_whitebox',
3813
'bzrlib.tests.test_win32utils',
3814
'bzrlib.tests.test_workingtree',
3815
'bzrlib.tests.test_workingtree_4',
3816
'bzrlib.tests.test_wsgi',
3817
'bzrlib.tests.test_xml',
3821
def _test_suite_modules_to_doctest():
3822
"""Return the list of modules to doctest."""
3824
# GZ 2009-03-31: No docstrings with -OO so there's nothing to doctest
3828
'bzrlib.branchbuilder',
3829
'bzrlib.decorators',
3832
'bzrlib.iterablefile',
3836
'bzrlib.symbol_versioning',
3839
'bzrlib.version_info_formats.format_custom',
3843
3280
def test_suite(keep_only=None, starting_with=None):
3844
3281
"""Build and return TestSuite for the whole of bzrlib.
3851
3288
This function can be replaced if you need to change the default test
3852
3289
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',
3855
3465
loader = TestUtil.TestLoader()
3857
if keep_only is not None:
3858
id_filter = TestIdList(keep_only)
3859
3467
if starting_with:
3468
starting_with = [test_prefix_alias_registry.resolve_alias(start)
3469
for start in starting_with]
3860
3470
# We take precedence over keep_only because *at loading time* using
3861
3471
# both options means we will load less tests for the same final result.
3862
3472
def interesting_module(name):
4190
3778
UnicodeFilenameFeature = _UnicodeFilenameFeature()
4193
class _CompatabilityThunkFeature(Feature):
4194
"""This feature is just a thunk to another feature.
4196
It issues a deprecation warning if it is accessed, to let you know that you
4197
should really use a different feature.
4200
def __init__(self, dep_version, module, name,
4201
replacement_name, replacement_module=None):
4202
super(_CompatabilityThunkFeature, self).__init__()
4203
self._module = module
4204
if replacement_module is None:
4205
replacement_module = module
4206
self._replacement_module = replacement_module
4208
self._replacement_name = replacement_name
4209
self._dep_version = dep_version
4210
self._feature = None
4213
if self._feature is None:
4214
depr_msg = self._dep_version % ('%s.%s'
4215
% (self._module, self._name))
4216
use_msg = ' Use %s.%s instead.' % (self._replacement_module,
4217
self._replacement_name)
4218
symbol_versioning.warn(depr_msg + use_msg, DeprecationWarning)
4219
# Import the new feature and use it as a replacement for the
4221
mod = __import__(self._replacement_module, {}, {},
4222
[self._replacement_name])
4223
self._feature = getattr(mod, self._replacement_name)
4227
return self._feature._probe()
4230
class ModuleAvailableFeature(Feature):
4231
"""This is a feature than describes a module we want to be available.
4233
Declare the name of the module in __init__(), and then after probing, the
4234
module will be available as 'self.module'.
4236
:ivar module: The module if it is available, else None.
4239
def __init__(self, module_name):
4240
super(ModuleAvailableFeature, self).__init__()
4241
self.module_name = module_name
4245
self._module = __import__(self.module_name, {}, {}, [''])
4252
if self.available(): # Make sure the probe has been done
4256
def feature_name(self):
4257
return self.module_name
4260
# This is kept here for compatibility, it is recommended to use
4261
# 'bzrlib.tests.feature.paramiko' instead
4262
ParamikoFeature = _CompatabilityThunkFeature(
4263
deprecated_in((2,1,0)),
4264
'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
4267
3781
def probe_unicode_in_user_encoding():
4268
3782
"""Try to encode several unicode strings to use in unicode-aware tests.
4269
3783
Return first successfull match.