170
191
self._overall_start_time = time.time()
171
192
self._strict = strict
194
def stopTestRun(self):
197
stopTime = time.time()
198
timeTaken = stopTime - self.startTime
199
# GZ 2010-07-19: Seems testtools has no printErrors method, and though
200
# the parent class method is similar have to duplicate
201
self._show_list('ERROR', self.errors)
202
self._show_list('FAIL', self.failures)
203
self.stream.write(self.sep2)
204
self.stream.write("%s %d test%s in %.3fs\n\n" % (actionTaken,
205
run, run != 1 and "s" or "", timeTaken))
206
if not self.wasSuccessful():
207
self.stream.write("FAILED (")
208
failed, errored = map(len, (self.failures, self.errors))
210
self.stream.write("failures=%d" % failed)
212
if failed: self.stream.write(", ")
213
self.stream.write("errors=%d" % errored)
214
if self.known_failure_count:
215
if failed or errored: self.stream.write(", ")
216
self.stream.write("known_failure_count=%d" %
217
self.known_failure_count)
218
self.stream.write(")\n")
220
if self.known_failure_count:
221
self.stream.write("OK (known_failures=%d)\n" %
222
self.known_failure_count)
224
self.stream.write("OK\n")
225
if self.skip_count > 0:
226
skipped = self.skip_count
227
self.stream.write('%d test%s skipped\n' %
228
(skipped, skipped != 1 and "s" or ""))
230
for feature, count in sorted(self.unsupported.items()):
231
self.stream.write("Missing feature '%s' skipped %d tests.\n" %
175
234
ok = self.wasStrictlySuccessful()
177
236
ok = self.wasSuccessful()
179
self.stream.write('tests passed\n')
181
self.stream.write('tests failed\n')
182
237
if TestCase._first_thread_leaker_id:
183
238
self.stream.write(
184
239
'%s is leaking threads among %d leaking tests.\n' % (
185
240
TestCase._first_thread_leaker_id,
186
241
TestCase._leaking_threads_tests))
188
def _extractBenchmarkTime(self, testCase):
242
# We don't report the main thread as an active one.
244
'%d non-main threads were left active in the end.\n'
245
% (TestCase._active_threads - 1))
247
def getDescription(self, test):
250
def _extractBenchmarkTime(self, testCase, details=None):
189
251
"""Add a benchmark time for the current test case."""
252
if details and 'benchtime' in details:
253
return float(''.join(details['benchtime'].iter_bytes()))
190
254
return getattr(testCase, "_benchtime", None)
192
256
def _elapsedTestTimeString(self):
499
548
return '%s%s' % (indent, err[1])
501
550
def report_error(self, test, err):
502
self.stream.writeln('ERROR %s\n%s'
551
self.stream.write('ERROR %s\n%s\n'
503
552
% (self._testTimeString(test),
504
553
self._error_summary(err)))
506
555
def report_failure(self, test, err):
507
self.stream.writeln(' FAIL %s\n%s'
556
self.stream.write(' FAIL %s\n%s\n'
508
557
% (self._testTimeString(test),
509
558
self._error_summary(err)))
511
560
def report_known_failure(self, test, err):
512
self.stream.writeln('XFAIL %s\n%s'
561
self.stream.write('XFAIL %s\n%s\n'
513
562
% (self._testTimeString(test),
514
563
self._error_summary(err)))
516
565
def report_success(self, test):
517
self.stream.writeln(' OK %s' % self._testTimeString(test))
566
self.stream.write(' OK %s\n' % self._testTimeString(test))
518
567
for bench_called, stats in getattr(test, '_benchcalls', []):
519
self.stream.writeln('LSProf output for %s(%s, %s)' % bench_called)
568
self.stream.write('LSProf output for %s(%s, %s)\n' % bench_called)
520
569
stats.pprint(file=self.stream)
521
570
# flush the stream so that we get smooth output. This verbose mode is
522
571
# used to show the output in PQM.
523
572
self.stream.flush()
525
574
def report_skip(self, test, reason):
526
self.stream.writeln(' SKIP %s\n%s'
575
self.stream.write(' SKIP %s\n%s\n'
527
576
% (self._testTimeString(test), reason))
529
def report_not_applicable(self, test, skip_excinfo):
530
self.stream.writeln(' N/A %s\n%s'
531
% (self._testTimeString(test),
532
self._error_summary(skip_excinfo)))
578
def report_not_applicable(self, test, reason):
579
self.stream.write(' N/A %s\n %s\n'
580
% (self._testTimeString(test), reason))
534
582
def report_unsupported(self, test, feature):
535
583
"""test cannot be run because feature is missing."""
536
self.stream.writeln("NODEP %s\n The feature '%s' is not available."
584
self.stream.write("NODEP %s\n The feature '%s' is not available.\n"
537
585
%(self._testTimeString(test), feature))
547
595
bench_history=None,
597
result_decorators=None,
551
self.stream = unittest._WritelnDecorator(stream)
599
"""Create a TextTestRunner.
601
:param result_decorators: An optional list of decorators to apply
602
to the result object being used by the runner. Decorators are
603
applied left to right - the first element in the list is the
606
# stream may know claim to know to write unicode strings, but in older
607
# pythons this goes sufficiently wrong that it is a bad idea. (
608
# specifically a built in file with encoding 'UTF-8' will still try
609
# to encode using ascii.
610
new_encoding = osutils.get_terminal_encoding()
611
codec = codecs.lookup(new_encoding)
612
if type(codec) is tuple:
616
encode = codec.encode
617
stream = osutils.UnicodeOrBytesToBytesWriter(encode, stream)
618
stream.encoding = new_encoding
552
620
self.descriptions = descriptions
553
621
self.verbosity = verbosity
554
622
self._bench_history = bench_history
555
self.list_only = list_only
556
623
self._strict = strict
624
self._result_decorators = result_decorators or []
558
626
def run(self, test):
559
627
"Run the given test case or test suite."
560
startTime = time.time()
561
628
if self.verbosity == 1:
562
629
result_class = TextTestResult
563
630
elif self.verbosity >= 2:
564
631
result_class = VerboseTestResult
565
result = result_class(self.stream,
632
original_result = result_class(self.stream,
566
633
self.descriptions,
568
635
bench_history=self._bench_history,
569
num_tests=test.countTestCases(),
570
636
strict=self._strict,
572
result.stop_early = self.stop_on_failure
573
result.report_starting()
575
if self.verbosity >= 2:
576
self.stream.writeln("Listing tests only ...\n")
578
for t in iter_suite_tests(test):
579
self.stream.writeln("%s" % (t.id()))
588
if isinstance(test, testtools.ConcurrentTestSuite):
589
# We need to catch bzr specific behaviors
590
test.run(BZRTransformingResult(result))
593
run = result.testsRun
595
stopTime = time.time()
596
timeTaken = stopTime - startTime
598
self.stream.writeln(result.separator2)
599
self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
600
run, run != 1 and "s" or "", timeTaken))
601
self.stream.writeln()
602
if not result.wasSuccessful():
603
self.stream.write("FAILED (")
604
failed, errored = map(len, (result.failures, result.errors))
606
self.stream.write("failures=%d" % failed)
608
if failed: self.stream.write(", ")
609
self.stream.write("errors=%d" % errored)
610
if result.known_failure_count:
611
if failed or errored: self.stream.write(", ")
612
self.stream.write("known_failure_count=%d" %
613
result.known_failure_count)
614
self.stream.writeln(")")
616
if result.known_failure_count:
617
self.stream.writeln("OK (known_failures=%d)" %
618
result.known_failure_count)
620
self.stream.writeln("OK")
621
if result.skip_count > 0:
622
skipped = result.skip_count
623
self.stream.writeln('%d test%s skipped' %
624
(skipped, skipped != 1 and "s" or ""))
625
if result.unsupported:
626
for feature, count in sorted(result.unsupported.items()):
627
self.stream.writeln("Missing feature '%s' skipped %d tests." %
638
# Signal to result objects that look at stop early policy to stop,
639
original_result.stop_early = self.stop_on_failure
640
result = original_result
641
for decorator in self._result_decorators:
642
result = decorator(result)
643
result.stop_early = self.stop_on_failure
644
result.startTestRun()
649
# higher level code uses our extended protocol to determine
650
# what exit code to give.
651
return original_result
633
654
def iter_suite_tests(suite):
905
940
def _lock_broken(self, result):
906
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.")
908
1070
def _ndiff_strings(self, a, b):
909
1071
"""Return ndiff between two strings containing lines.
1385
1585
def _do_skip(self, result, reason):
1386
1586
addSkip = getattr(result, 'addSkip', None)
1387
1587
if not callable(addSkip):
1388
result.addError(self, sys.exc_info())
1588
result.addSuccess(result)
1390
1590
addSkip(self, reason)
1392
def run(self, result=None):
1393
if result is None: result = self.defaultTestResult()
1394
for feature in getattr(self, '_test_needs_features', []):
1395
if not feature.available():
1396
result.startTest(self)
1397
if getattr(result, 'addNotSupported', None):
1398
result.addNotSupported(self, feature)
1400
result.addSuccess(self)
1401
result.stopTest(self)
1405
result.startTest(self)
1406
absent_attr = object()
1408
method_name = getattr(self, '_testMethodName', absent_attr)
1409
if method_name is absent_attr:
1411
method_name = getattr(self, '_TestCase__testMethodName')
1412
testMethod = getattr(self, method_name)
1416
if not self._bzr_test_setUp_run:
1418
"test setUp did not invoke "
1419
"bzrlib.tests.TestCase's setUp")
1420
except KeyboardInterrupt:
1423
except TestSkipped, e:
1424
self._do_skip(result, e.args[0])
1428
result.addError(self, sys.exc_info())
1436
except self.failureException:
1437
result.addFailure(self, sys.exc_info())
1438
except TestSkipped, e:
1440
reason = "No reason given."
1443
self._do_skip(result, reason)
1444
except KeyboardInterrupt:
1448
result.addError(self, sys.exc_info())
1452
if not self._bzr_test_tearDown_run:
1454
"test tearDown did not invoke "
1455
"bzrlib.tests.TestCase's tearDown")
1456
except KeyboardInterrupt:
1460
result.addError(self, sys.exc_info())
1463
if ok: result.addSuccess(self)
1465
result.stopTest(self)
1467
except TestNotApplicable:
1468
# Not moved from the result [yet].
1471
except KeyboardInterrupt:
1476
for attr_name in self.attrs_to_keep:
1477
if attr_name in self.__dict__:
1478
saved_attrs[attr_name] = self.__dict__[attr_name]
1479
self.__dict__ = saved_attrs
1483
self._log_contents = ''
1484
self._bzr_test_tearDown_run = True
1485
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)
1487
1622
def time(self, callable, *args, **kwargs):
1488
1623
"""Run callable and accrue the time it takes to the benchmark time.
3103
3365
def addSuccess(self, test):
3104
3366
self.result.addSuccess(test)
3106
def _error_looks_like(self, prefix, err):
3107
"""Deserialize exception and returns the stringify value."""
3111
if isinstance(exc, subunit.RemoteException):
3112
# stringify the exception gives access to the remote traceback
3113
# We search the last line for 'prefix'
3114
lines = str(exc).split('\n')
3115
while lines and not lines[-1]:
3118
if lines[-1].startswith(prefix):
3119
value = lines[-1][len(prefix):]
3368
def addError(self, test, err):
3369
self.result.addError(test, err)
3371
def addFailure(self, test, err):
3372
self.result.addFailure(test, err)
3373
ForwardingResult = testtools.ExtendedToOriginalDecorator
3376
class ProfileResult(ForwardingResult):
3377
"""Generate profiling data for all activity between start and success.
3379
The profile data is appended to the test's _benchcalls attribute and can
3380
be accessed by the forwarded-to TestResult.
3382
While it might be cleaner do accumulate this in stopTest, addSuccess is
3383
where our existing output support for lsprof is, and this class aims to
3384
fit in with that: while it could be moved it's not necessary to accomplish
3385
test profiling, nor would it be dramatically cleaner.
3388
def startTest(self, test):
3389
self.profiler = bzrlib.lsprof.BzrProfiler()
3390
# Prevent deadlocks in tests that use lsprof: those tests will
3392
bzrlib.lsprof.BzrProfiler.profiler_block = 0
3393
self.profiler.start()
3394
ForwardingResult.startTest(self, test)
3396
def addSuccess(self, test):
3397
stats = self.profiler.stop()
3399
calls = test._benchcalls
3400
except AttributeError:
3401
test._benchcalls = []
3402
calls = test._benchcalls
3403
calls.append(((test.id(), "", ""), stats))
3404
ForwardingResult.addSuccess(self, test)
3406
def stopTest(self, test):
3407
ForwardingResult.stopTest(self, test)
3408
self.profiler = None
3123
3411
# Controlled by "bzr selftest -E=..." option
3412
# Currently supported:
3413
# -Eallow_debug Will no longer clear debug.debug_flags() so it
3414
# preserves any flags supplied at the command line.
3415
# -Edisable_lock_checks Turns errors in mismatched locks into simple prints
3416
# rather than failing tests. And no longer raise
3417
# LockContention when fctnl locks are not being used
3418
# with proper exclusion rules.
3419
# -Ethreads Will display thread ident at creation/join time to
3420
# help track thread leaks
3124
3421
selftest_debug_flags = set()
3338
3650
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
3653
def _test_suite_testmod_names():
3654
"""Return the standard list of test module names to test."""
3657
'bzrlib.tests.blackbox',
3658
'bzrlib.tests.commands',
3659
'bzrlib.tests.doc_generate',
3660
'bzrlib.tests.per_branch',
3661
'bzrlib.tests.per_controldir',
3662
'bzrlib.tests.per_controldir_colo',
3663
'bzrlib.tests.per_foreign_vcs',
3664
'bzrlib.tests.per_interrepository',
3665
'bzrlib.tests.per_intertree',
3666
'bzrlib.tests.per_inventory',
3667
'bzrlib.tests.per_interbranch',
3668
'bzrlib.tests.per_lock',
3669
'bzrlib.tests.per_merger',
3670
'bzrlib.tests.per_transport',
3671
'bzrlib.tests.per_tree',
3672
'bzrlib.tests.per_pack_repository',
3673
'bzrlib.tests.per_repository',
3674
'bzrlib.tests.per_repository_chk',
3675
'bzrlib.tests.per_repository_reference',
3676
'bzrlib.tests.per_uifactory',
3677
'bzrlib.tests.per_versionedfile',
3678
'bzrlib.tests.per_workingtree',
3679
'bzrlib.tests.test__annotator',
3680
'bzrlib.tests.test__bencode',
3681
'bzrlib.tests.test__btree_serializer',
3682
'bzrlib.tests.test__chk_map',
3683
'bzrlib.tests.test__dirstate_helpers',
3684
'bzrlib.tests.test__groupcompress',
3685
'bzrlib.tests.test__known_graph',
3686
'bzrlib.tests.test__rio',
3687
'bzrlib.tests.test__simple_set',
3688
'bzrlib.tests.test__static_tuple',
3689
'bzrlib.tests.test__walkdirs_win32',
3690
'bzrlib.tests.test_ancestry',
3691
'bzrlib.tests.test_annotate',
3692
'bzrlib.tests.test_api',
3693
'bzrlib.tests.test_atomicfile',
3694
'bzrlib.tests.test_bad_files',
3695
'bzrlib.tests.test_bisect_multi',
3696
'bzrlib.tests.test_branch',
3697
'bzrlib.tests.test_branchbuilder',
3698
'bzrlib.tests.test_btree_index',
3699
'bzrlib.tests.test_bugtracker',
3700
'bzrlib.tests.test_bundle',
3701
'bzrlib.tests.test_bzrdir',
3702
'bzrlib.tests.test__chunks_to_lines',
3703
'bzrlib.tests.test_cache_utf8',
3704
'bzrlib.tests.test_chk_map',
3705
'bzrlib.tests.test_chk_serializer',
3706
'bzrlib.tests.test_chunk_writer',
3707
'bzrlib.tests.test_clean_tree',
3708
'bzrlib.tests.test_cleanup',
3709
'bzrlib.tests.test_cmdline',
3710
'bzrlib.tests.test_commands',
3711
'bzrlib.tests.test_commit',
3712
'bzrlib.tests.test_commit_merge',
3713
'bzrlib.tests.test_config',
3714
'bzrlib.tests.test_conflicts',
3715
'bzrlib.tests.test_counted_lock',
3716
'bzrlib.tests.test_crash',
3717
'bzrlib.tests.test_decorators',
3718
'bzrlib.tests.test_delta',
3719
'bzrlib.tests.test_debug',
3720
'bzrlib.tests.test_deprecated_graph',
3721
'bzrlib.tests.test_diff',
3722
'bzrlib.tests.test_directory_service',
3723
'bzrlib.tests.test_dirstate',
3724
'bzrlib.tests.test_email_message',
3725
'bzrlib.tests.test_eol_filters',
3726
'bzrlib.tests.test_errors',
3727
'bzrlib.tests.test_export',
3728
'bzrlib.tests.test_extract',
3729
'bzrlib.tests.test_fetch',
3730
'bzrlib.tests.test_fixtures',
3731
'bzrlib.tests.test_fifo_cache',
3732
'bzrlib.tests.test_filters',
3733
'bzrlib.tests.test_ftp_transport',
3734
'bzrlib.tests.test_foreign',
3735
'bzrlib.tests.test_generate_docs',
3736
'bzrlib.tests.test_generate_ids',
3737
'bzrlib.tests.test_globbing',
3738
'bzrlib.tests.test_gpg',
3739
'bzrlib.tests.test_graph',
3740
'bzrlib.tests.test_groupcompress',
3741
'bzrlib.tests.test_hashcache',
3742
'bzrlib.tests.test_help',
3743
'bzrlib.tests.test_hooks',
3744
'bzrlib.tests.test_http',
3745
'bzrlib.tests.test_http_response',
3746
'bzrlib.tests.test_https_ca_bundle',
3747
'bzrlib.tests.test_identitymap',
3748
'bzrlib.tests.test_ignores',
3749
'bzrlib.tests.test_index',
3750
'bzrlib.tests.test_import_tariff',
3751
'bzrlib.tests.test_info',
3752
'bzrlib.tests.test_inv',
3753
'bzrlib.tests.test_inventory_delta',
3754
'bzrlib.tests.test_knit',
3755
'bzrlib.tests.test_lazy_import',
3756
'bzrlib.tests.test_lazy_regex',
3757
'bzrlib.tests.test_library_state',
3758
'bzrlib.tests.test_lock',
3759
'bzrlib.tests.test_lockable_files',
3760
'bzrlib.tests.test_lockdir',
3761
'bzrlib.tests.test_log',
3762
'bzrlib.tests.test_lru_cache',
3763
'bzrlib.tests.test_lsprof',
3764
'bzrlib.tests.test_mail_client',
3765
'bzrlib.tests.test_matchers',
3766
'bzrlib.tests.test_memorytree',
3767
'bzrlib.tests.test_merge',
3768
'bzrlib.tests.test_merge3',
3769
'bzrlib.tests.test_merge_core',
3770
'bzrlib.tests.test_merge_directive',
3771
'bzrlib.tests.test_missing',
3772
'bzrlib.tests.test_msgeditor',
3773
'bzrlib.tests.test_multiparent',
3774
'bzrlib.tests.test_mutabletree',
3775
'bzrlib.tests.test_nonascii',
3776
'bzrlib.tests.test_options',
3777
'bzrlib.tests.test_osutils',
3778
'bzrlib.tests.test_osutils_encodings',
3779
'bzrlib.tests.test_pack',
3780
'bzrlib.tests.test_patch',
3781
'bzrlib.tests.test_patches',
3782
'bzrlib.tests.test_permissions',
3783
'bzrlib.tests.test_plugins',
3784
'bzrlib.tests.test_progress',
3785
'bzrlib.tests.test_read_bundle',
3786
'bzrlib.tests.test_reconcile',
3787
'bzrlib.tests.test_reconfigure',
3788
'bzrlib.tests.test_registry',
3789
'bzrlib.tests.test_remote',
3790
'bzrlib.tests.test_rename_map',
3791
'bzrlib.tests.test_repository',
3792
'bzrlib.tests.test_revert',
3793
'bzrlib.tests.test_revision',
3794
'bzrlib.tests.test_revisionspec',
3795
'bzrlib.tests.test_revisiontree',
3796
'bzrlib.tests.test_rio',
3797
'bzrlib.tests.test_rules',
3798
'bzrlib.tests.test_sampler',
3799
'bzrlib.tests.test_script',
3800
'bzrlib.tests.test_selftest',
3801
'bzrlib.tests.test_serializer',
3802
'bzrlib.tests.test_setup',
3803
'bzrlib.tests.test_sftp_transport',
3804
'bzrlib.tests.test_shelf',
3805
'bzrlib.tests.test_shelf_ui',
3806
'bzrlib.tests.test_smart',
3807
'bzrlib.tests.test_smart_add',
3808
'bzrlib.tests.test_smart_request',
3809
'bzrlib.tests.test_smart_transport',
3810
'bzrlib.tests.test_smtp_connection',
3811
'bzrlib.tests.test_source',
3812
'bzrlib.tests.test_ssh_transport',
3813
'bzrlib.tests.test_status',
3814
'bzrlib.tests.test_store',
3815
'bzrlib.tests.test_strace',
3816
'bzrlib.tests.test_subsume',
3817
'bzrlib.tests.test_switch',
3818
'bzrlib.tests.test_symbol_versioning',
3819
'bzrlib.tests.test_tag',
3820
'bzrlib.tests.test_test_server',
3821
'bzrlib.tests.test_testament',
3822
'bzrlib.tests.test_textfile',
3823
'bzrlib.tests.test_textmerge',
3824
'bzrlib.tests.test_timestamp',
3825
'bzrlib.tests.test_trace',
3826
'bzrlib.tests.test_transactions',
3827
'bzrlib.tests.test_transform',
3828
'bzrlib.tests.test_transport',
3829
'bzrlib.tests.test_transport_log',
3830
'bzrlib.tests.test_tree',
3831
'bzrlib.tests.test_treebuilder',
3832
'bzrlib.tests.test_treeshape',
3833
'bzrlib.tests.test_tsort',
3834
'bzrlib.tests.test_tuned_gzip',
3835
'bzrlib.tests.test_ui',
3836
'bzrlib.tests.test_uncommit',
3837
'bzrlib.tests.test_upgrade',
3838
'bzrlib.tests.test_upgrade_stacked',
3839
'bzrlib.tests.test_urlutils',
3840
'bzrlib.tests.test_version',
3841
'bzrlib.tests.test_version_info',
3842
'bzrlib.tests.test_versionedfile',
3843
'bzrlib.tests.test_weave',
3844
'bzrlib.tests.test_whitebox',
3845
'bzrlib.tests.test_win32utils',
3846
'bzrlib.tests.test_workingtree',
3847
'bzrlib.tests.test_workingtree_4',
3848
'bzrlib.tests.test_wsgi',
3849
'bzrlib.tests.test_xml',
3853
def _test_suite_modules_to_doctest():
3854
"""Return the list of modules to doctest."""
3856
# GZ 2009-03-31: No docstrings with -OO so there's nothing to doctest
3860
'bzrlib.branchbuilder',
3861
'bzrlib.decorators',
3864
'bzrlib.iterablefile',
3868
'bzrlib.symbol_versioning',
3870
'bzrlib.tests.fixtures',
3872
'bzrlib.version_info_formats.format_custom',
3341
3876
def test_suite(keep_only=None, starting_with=None):
3342
3877
"""Build and return TestSuite for the whole of bzrlib.
3349
3884
This function can be replaced if you need to change the default test
3350
3885
suite on a global basis, but it is not encouraged.
3354
'bzrlib.tests.blackbox',
3355
'bzrlib.tests.commands',
3356
'bzrlib.tests.per_branch',
3357
'bzrlib.tests.per_bzrdir',
3358
'bzrlib.tests.per_interrepository',
3359
'bzrlib.tests.per_intertree',
3360
'bzrlib.tests.per_inventory',
3361
'bzrlib.tests.per_interbranch',
3362
'bzrlib.tests.per_lock',
3363
'bzrlib.tests.per_transport',
3364
'bzrlib.tests.per_tree',
3365
'bzrlib.tests.per_repository',
3366
'bzrlib.tests.per_repository_chk',
3367
'bzrlib.tests.per_repository_reference',
3368
'bzrlib.tests.per_workingtree',
3369
'bzrlib.tests.test__annotator',
3370
'bzrlib.tests.test__chk_map',
3371
'bzrlib.tests.test__dirstate_helpers',
3372
'bzrlib.tests.test__groupcompress',
3373
'bzrlib.tests.test__known_graph',
3374
'bzrlib.tests.test__rio',
3375
'bzrlib.tests.test__walkdirs_win32',
3376
'bzrlib.tests.test_ancestry',
3377
'bzrlib.tests.test_annotate',
3378
'bzrlib.tests.test_api',
3379
'bzrlib.tests.test_atomicfile',
3380
'bzrlib.tests.test_bad_files',
3381
'bzrlib.tests.test_bencode',
3382
'bzrlib.tests.test_bisect_multi',
3383
'bzrlib.tests.test_branch',
3384
'bzrlib.tests.test_branchbuilder',
3385
'bzrlib.tests.test_btree_index',
3386
'bzrlib.tests.test_bugtracker',
3387
'bzrlib.tests.test_bundle',
3388
'bzrlib.tests.test_bzrdir',
3389
'bzrlib.tests.test__chunks_to_lines',
3390
'bzrlib.tests.test_cache_utf8',
3391
'bzrlib.tests.test_chk_map',
3392
'bzrlib.tests.test_chk_serializer',
3393
'bzrlib.tests.test_chunk_writer',
3394
'bzrlib.tests.test_clean_tree',
3395
'bzrlib.tests.test_commands',
3396
'bzrlib.tests.test_commit',
3397
'bzrlib.tests.test_commit_merge',
3398
'bzrlib.tests.test_config',
3399
'bzrlib.tests.test_conflicts',
3400
'bzrlib.tests.test_counted_lock',
3401
'bzrlib.tests.test_decorators',
3402
'bzrlib.tests.test_delta',
3403
'bzrlib.tests.test_debug',
3404
'bzrlib.tests.test_deprecated_graph',
3405
'bzrlib.tests.test_diff',
3406
'bzrlib.tests.test_directory_service',
3407
'bzrlib.tests.test_dirstate',
3408
'bzrlib.tests.test_email_message',
3409
'bzrlib.tests.test_eol_filters',
3410
'bzrlib.tests.test_errors',
3411
'bzrlib.tests.test_export',
3412
'bzrlib.tests.test_extract',
3413
'bzrlib.tests.test_fetch',
3414
'bzrlib.tests.test_fifo_cache',
3415
'bzrlib.tests.test_filters',
3416
'bzrlib.tests.test_ftp_transport',
3417
'bzrlib.tests.test_foreign',
3418
'bzrlib.tests.test_generate_docs',
3419
'bzrlib.tests.test_generate_ids',
3420
'bzrlib.tests.test_globbing',
3421
'bzrlib.tests.test_gpg',
3422
'bzrlib.tests.test_graph',
3423
'bzrlib.tests.test_groupcompress',
3424
'bzrlib.tests.test_hashcache',
3425
'bzrlib.tests.test_help',
3426
'bzrlib.tests.test_hooks',
3427
'bzrlib.tests.test_http',
3428
'bzrlib.tests.test_http_response',
3429
'bzrlib.tests.test_https_ca_bundle',
3430
'bzrlib.tests.test_identitymap',
3431
'bzrlib.tests.test_ignores',
3432
'bzrlib.tests.test_index',
3433
'bzrlib.tests.test_info',
3434
'bzrlib.tests.test_inv',
3435
'bzrlib.tests.test_inventory_delta',
3436
'bzrlib.tests.test_knit',
3437
'bzrlib.tests.test_lazy_import',
3438
'bzrlib.tests.test_lazy_regex',
3439
'bzrlib.tests.test_lockable_files',
3440
'bzrlib.tests.test_lockdir',
3441
'bzrlib.tests.test_log',
3442
'bzrlib.tests.test_lru_cache',
3443
'bzrlib.tests.test_lsprof',
3444
'bzrlib.tests.test_mail_client',
3445
'bzrlib.tests.test_memorytree',
3446
'bzrlib.tests.test_merge',
3447
'bzrlib.tests.test_merge3',
3448
'bzrlib.tests.test_merge_core',
3449
'bzrlib.tests.test_merge_directive',
3450
'bzrlib.tests.test_missing',
3451
'bzrlib.tests.test_msgeditor',
3452
'bzrlib.tests.test_multiparent',
3453
'bzrlib.tests.test_mutabletree',
3454
'bzrlib.tests.test_nonascii',
3455
'bzrlib.tests.test_options',
3456
'bzrlib.tests.test_osutils',
3457
'bzrlib.tests.test_osutils_encodings',
3458
'bzrlib.tests.test_pack',
3459
'bzrlib.tests.test_pack_repository',
3460
'bzrlib.tests.test_patch',
3461
'bzrlib.tests.test_patches',
3462
'bzrlib.tests.test_permissions',
3463
'bzrlib.tests.test_plugins',
3464
'bzrlib.tests.test_progress',
3465
'bzrlib.tests.test_read_bundle',
3466
'bzrlib.tests.test_reconcile',
3467
'bzrlib.tests.test_reconfigure',
3468
'bzrlib.tests.test_registry',
3469
'bzrlib.tests.test_remote',
3470
'bzrlib.tests.test_rename_map',
3471
'bzrlib.tests.test_repository',
3472
'bzrlib.tests.test_revert',
3473
'bzrlib.tests.test_revision',
3474
'bzrlib.tests.test_revisionspec',
3475
'bzrlib.tests.test_revisiontree',
3476
'bzrlib.tests.test_rio',
3477
'bzrlib.tests.test_rules',
3478
'bzrlib.tests.test_sampler',
3479
'bzrlib.tests.test_selftest',
3480
'bzrlib.tests.test_serializer',
3481
'bzrlib.tests.test_setup',
3482
'bzrlib.tests.test_sftp_transport',
3483
'bzrlib.tests.test_shelf',
3484
'bzrlib.tests.test_shelf_ui',
3485
'bzrlib.tests.test_smart',
3486
'bzrlib.tests.test_smart_add',
3487
'bzrlib.tests.test_smart_request',
3488
'bzrlib.tests.test_smart_transport',
3489
'bzrlib.tests.test_smtp_connection',
3490
'bzrlib.tests.test_source',
3491
'bzrlib.tests.test_ssh_transport',
3492
'bzrlib.tests.test_status',
3493
'bzrlib.tests.test_store',
3494
'bzrlib.tests.test_strace',
3495
'bzrlib.tests.test_subsume',
3496
'bzrlib.tests.test_switch',
3497
'bzrlib.tests.test_symbol_versioning',
3498
'bzrlib.tests.test_tag',
3499
'bzrlib.tests.test_testament',
3500
'bzrlib.tests.test_textfile',
3501
'bzrlib.tests.test_textmerge',
3502
'bzrlib.tests.test_timestamp',
3503
'bzrlib.tests.test_trace',
3504
'bzrlib.tests.test_transactions',
3505
'bzrlib.tests.test_transform',
3506
'bzrlib.tests.test_transport',
3507
'bzrlib.tests.test_transport_log',
3508
'bzrlib.tests.test_tree',
3509
'bzrlib.tests.test_treebuilder',
3510
'bzrlib.tests.test_tsort',
3511
'bzrlib.tests.test_tuned_gzip',
3512
'bzrlib.tests.test_ui',
3513
'bzrlib.tests.test_uncommit',
3514
'bzrlib.tests.test_upgrade',
3515
'bzrlib.tests.test_upgrade_stacked',
3516
'bzrlib.tests.test_urlutils',
3517
'bzrlib.tests.test_version',
3518
'bzrlib.tests.test_version_info',
3519
'bzrlib.tests.test_versionedfile',
3520
'bzrlib.tests.test_weave',
3521
'bzrlib.tests.test_whitebox',
3522
'bzrlib.tests.test_win32utils',
3523
'bzrlib.tests.test_workingtree',
3524
'bzrlib.tests.test_workingtree_4',
3525
'bzrlib.tests.test_wsgi',
3526
'bzrlib.tests.test_xml',
3529
3888
loader = TestUtil.TestLoader()
3531
3890
if keep_only is not None:
3532
3891
id_filter = TestIdList(keep_only)
3533
3892
if starting_with:
3534
starting_with = [test_prefix_alias_registry.resolve_alias(start)
3535
for start in starting_with]
3536
3893
# We take precedence over keep_only because *at loading time* using
3537
3894
# both options means we will load less tests for the same final result.
3538
3895
def interesting_module(name):
3843
4226
UnicodeFilenameFeature = _UnicodeFilenameFeature()
4229
class _CompatabilityThunkFeature(Feature):
4230
"""This feature is just a thunk to another feature.
4232
It issues a deprecation warning if it is accessed, to let you know that you
4233
should really use a different feature.
4236
def __init__(self, dep_version, module, name,
4237
replacement_name, replacement_module=None):
4238
super(_CompatabilityThunkFeature, self).__init__()
4239
self._module = module
4240
if replacement_module is None:
4241
replacement_module = module
4242
self._replacement_module = replacement_module
4244
self._replacement_name = replacement_name
4245
self._dep_version = dep_version
4246
self._feature = None
4249
if self._feature is None:
4250
depr_msg = self._dep_version % ('%s.%s'
4251
% (self._module, self._name))
4252
use_msg = ' Use %s.%s instead.' % (self._replacement_module,
4253
self._replacement_name)
4254
symbol_versioning.warn(depr_msg + use_msg, DeprecationWarning)
4255
# Import the new feature and use it as a replacement for the
4257
mod = __import__(self._replacement_module, {}, {},
4258
[self._replacement_name])
4259
self._feature = getattr(mod, self._replacement_name)
4263
return self._feature._probe()
4266
class ModuleAvailableFeature(Feature):
4267
"""This is a feature than describes a module we want to be available.
4269
Declare the name of the module in __init__(), and then after probing, the
4270
module will be available as 'self.module'.
4272
:ivar module: The module if it is available, else None.
4275
def __init__(self, module_name):
4276
super(ModuleAvailableFeature, self).__init__()
4277
self.module_name = module_name
4281
self._module = __import__(self.module_name, {}, {}, [''])
4288
if self.available(): # Make sure the probe has been done
4292
def feature_name(self):
4293
return self.module_name
4296
# This is kept here for compatibility, it is recommended to use
4297
# 'bzrlib.tests.feature.paramiko' instead
4298
ParamikoFeature = _CompatabilityThunkFeature(
4299
deprecated_in((2,1,0)),
4300
'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
3846
4303
def probe_unicode_in_user_encoding():
3847
4304
"""Try to encode several unicode strings to use in unicode-aware tests.
3848
4305
Return first successfull match.