196
174
self._overall_start_time = time.time()
197
175
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." %
178
# nb: called stopTestRun in the version of this that Python merged
179
# upstream, according to lifeless 20090803
237
181
ok = self.wasStrictlySuccessful()
239
183
ok = self.wasSuccessful()
185
self.stream.write('tests passed\n')
187
self.stream.write('tests failed\n')
240
188
if TestCase._first_thread_leaker_id:
241
189
self.stream.write(
242
190
'%s is leaking threads among %d leaking tests.\n' % (
243
191
TestCase._first_thread_leaker_id,
244
192
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):
194
def _extractBenchmarkTime(self, testCase):
254
195
"""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
196
return getattr(testCase, "_benchtime", None)
259
198
def _elapsedTestTimeString(self):
606
588
applied left to right - the first element in the list is the
607
589
innermost decorator.
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
591
self.stream = unittest._WritelnDecorator(stream)
623
592
self.descriptions = descriptions
624
593
self.verbosity = verbosity
625
594
self._bench_history = bench_history
595
self.list_only = list_only
626
596
self._strict = strict
627
597
self._result_decorators = result_decorators or []
629
599
def run(self, test):
630
600
"Run the given test case or test suite."
601
startTime = time.time()
631
602
if self.verbosity == 1:
632
603
result_class = TextTestResult
633
604
elif self.verbosity >= 2:
634
605
result_class = VerboseTestResult
635
original_result = result_class(self.stream,
606
result = result_class(self.stream,
636
607
self.descriptions,
638
609
bench_history=self._bench_history,
639
610
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
613
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
614
run_result = decorator(run_result)
615
result.stop_early = self.stop_on_failure
616
result.report_starting()
618
if self.verbosity >= 2:
619
self.stream.writeln("Listing tests only ...\n")
621
for t in iter_suite_tests(test):
622
self.stream.writeln("%s" % (t.id()))
631
if isinstance(test, testtools.ConcurrentTestSuite):
632
# We need to catch bzr specific behaviors
633
test.run(BZRTransformingResult(run_result))
636
run = result.testsRun
638
stopTime = time.time()
639
timeTaken = stopTime - startTime
641
self.stream.writeln(result.separator2)
642
self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
643
run, run != 1 and "s" or "", timeTaken))
644
self.stream.writeln()
645
if not result.wasSuccessful():
646
self.stream.write("FAILED (")
647
failed, errored = map(len, (result.failures, result.errors))
649
self.stream.write("failures=%d" % failed)
651
if failed: self.stream.write(", ")
652
self.stream.write("errors=%d" % errored)
653
if result.known_failure_count:
654
if failed or errored: self.stream.write(", ")
655
self.stream.write("known_failure_count=%d" %
656
result.known_failure_count)
657
self.stream.writeln(")")
659
if result.known_failure_count:
660
self.stream.writeln("OK (known_failures=%d)" %
661
result.known_failure_count)
663
self.stream.writeln("OK")
664
if result.skip_count > 0:
665
skipped = result.skip_count
666
self.stream.writeln('%d test%s skipped' %
667
(skipped, skipped != 1 and "s" or ""))
668
if result.unsupported:
669
for feature, count in sorted(result.unsupported.items()):
670
self.stream.writeln("Missing feature '%s' skipped %d tests." %
657
676
def iter_suite_tests(suite):
941
940
def _lock_broken(self, result):
942
941
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.")
1071
943
def _ndiff_strings(self, a, b):
1072
944
"""Return ndiff between two strings containing lines.
1586
1433
def _do_skip(self, result, reason):
1587
1434
addSkip = getattr(result, 'addSkip', None)
1588
1435
if not callable(addSkip):
1589
result.addSuccess(result)
1436
result.addError(self, sys.exc_info())
1591
1438
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)
1440
def run(self, result=None):
1441
if result is None: result = self.defaultTestResult()
1442
for feature in getattr(self, '_test_needs_features', []):
1443
if not feature.available():
1444
result.startTest(self)
1445
if getattr(result, 'addNotSupported', None):
1446
result.addNotSupported(self, feature)
1448
result.addSuccess(self)
1449
result.stopTest(self)
1453
result.startTest(self)
1454
absent_attr = object()
1456
method_name = getattr(self, '_testMethodName', absent_attr)
1457
if method_name is absent_attr:
1459
method_name = getattr(self, '_TestCase__testMethodName')
1460
testMethod = getattr(self, method_name)
1464
if not self._bzr_test_setUp_run:
1466
"test setUp did not invoke "
1467
"bzrlib.tests.TestCase's setUp")
1468
except KeyboardInterrupt:
1471
except TestSkipped, e:
1472
self._do_skip(result, e.args[0])
1476
result.addError(self, sys.exc_info())
1484
except self.failureException:
1485
result.addFailure(self, sys.exc_info())
1486
except TestSkipped, e:
1488
reason = "No reason given."
1491
self._do_skip(result, reason)
1492
except KeyboardInterrupt:
1496
result.addError(self, sys.exc_info())
1500
if not self._bzr_test_tearDown_run:
1502
"test tearDown did not invoke "
1503
"bzrlib.tests.TestCase's tearDown")
1504
except KeyboardInterrupt:
1508
result.addError(self, sys.exc_info())
1511
if ok: result.addSuccess(self)
1513
result.stopTest(self)
1515
except TestNotApplicable:
1516
# Not moved from the result [yet].
1519
except KeyboardInterrupt:
1524
for attr_name in self.attrs_to_keep:
1525
if attr_name in self.__dict__:
1526
saved_attrs[attr_name] = self.__dict__[attr_name]
1527
self.__dict__ = saved_attrs
1531
self._log_contents = ''
1532
self._bzr_test_tearDown_run = True
1533
unittest.TestCase.tearDown(self)
1623
1535
def time(self, callable, *args, **kwargs):
1624
1536
"""Run callable and accrue the time it takes to the benchmark time.
3626
3477
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_matchers',
3738
'bzrlib.tests.test_memorytree',
3739
'bzrlib.tests.test_merge',
3740
'bzrlib.tests.test_merge3',
3741
'bzrlib.tests.test_merge_core',
3742
'bzrlib.tests.test_merge_directive',
3743
'bzrlib.tests.test_missing',
3744
'bzrlib.tests.test_msgeditor',
3745
'bzrlib.tests.test_multiparent',
3746
'bzrlib.tests.test_mutabletree',
3747
'bzrlib.tests.test_nonascii',
3748
'bzrlib.tests.test_options',
3749
'bzrlib.tests.test_osutils',
3750
'bzrlib.tests.test_osutils_encodings',
3751
'bzrlib.tests.test_pack',
3752
'bzrlib.tests.test_patch',
3753
'bzrlib.tests.test_patches',
3754
'bzrlib.tests.test_permissions',
3755
'bzrlib.tests.test_plugins',
3756
'bzrlib.tests.test_progress',
3757
'bzrlib.tests.test_read_bundle',
3758
'bzrlib.tests.test_reconcile',
3759
'bzrlib.tests.test_reconfigure',
3760
'bzrlib.tests.test_registry',
3761
'bzrlib.tests.test_remote',
3762
'bzrlib.tests.test_rename_map',
3763
'bzrlib.tests.test_repository',
3764
'bzrlib.tests.test_revert',
3765
'bzrlib.tests.test_revision',
3766
'bzrlib.tests.test_revisionspec',
3767
'bzrlib.tests.test_revisiontree',
3768
'bzrlib.tests.test_rio',
3769
'bzrlib.tests.test_rules',
3770
'bzrlib.tests.test_sampler',
3771
'bzrlib.tests.test_script',
3772
'bzrlib.tests.test_selftest',
3773
'bzrlib.tests.test_serializer',
3774
'bzrlib.tests.test_setup',
3775
'bzrlib.tests.test_sftp_transport',
3776
'bzrlib.tests.test_shelf',
3777
'bzrlib.tests.test_shelf_ui',
3778
'bzrlib.tests.test_smart',
3779
'bzrlib.tests.test_smart_add',
3780
'bzrlib.tests.test_smart_request',
3781
'bzrlib.tests.test_smart_transport',
3782
'bzrlib.tests.test_smtp_connection',
3783
'bzrlib.tests.test_source',
3784
'bzrlib.tests.test_ssh_transport',
3785
'bzrlib.tests.test_status',
3786
'bzrlib.tests.test_store',
3787
'bzrlib.tests.test_strace',
3788
'bzrlib.tests.test_subsume',
3789
'bzrlib.tests.test_switch',
3790
'bzrlib.tests.test_symbol_versioning',
3791
'bzrlib.tests.test_tag',
3792
'bzrlib.tests.test_testament',
3793
'bzrlib.tests.test_textfile',
3794
'bzrlib.tests.test_textmerge',
3795
'bzrlib.tests.test_timestamp',
3796
'bzrlib.tests.test_trace',
3797
'bzrlib.tests.test_transactions',
3798
'bzrlib.tests.test_transform',
3799
'bzrlib.tests.test_transport',
3800
'bzrlib.tests.test_transport_log',
3801
'bzrlib.tests.test_tree',
3802
'bzrlib.tests.test_treebuilder',
3803
'bzrlib.tests.test_tsort',
3804
'bzrlib.tests.test_tuned_gzip',
3805
'bzrlib.tests.test_ui',
3806
'bzrlib.tests.test_uncommit',
3807
'bzrlib.tests.test_upgrade',
3808
'bzrlib.tests.test_upgrade_stacked',
3809
'bzrlib.tests.test_urlutils',
3810
'bzrlib.tests.test_version',
3811
'bzrlib.tests.test_version_info',
3812
'bzrlib.tests.test_weave',
3813
'bzrlib.tests.test_whitebox',
3814
'bzrlib.tests.test_win32utils',
3815
'bzrlib.tests.test_workingtree',
3816
'bzrlib.tests.test_workingtree_4',
3817
'bzrlib.tests.test_wsgi',
3818
'bzrlib.tests.test_xml',
3822
def _test_suite_modules_to_doctest():
3823
"""Return the list of modules to doctest."""
3825
# GZ 2009-03-31: No docstrings with -OO so there's nothing to doctest
3829
'bzrlib.branchbuilder',
3830
'bzrlib.decorators',
3833
'bzrlib.iterablefile',
3837
'bzrlib.symbol_versioning',
3840
'bzrlib.version_info_formats.format_custom',
3844
3480
def test_suite(keep_only=None, starting_with=None):
3845
3481
"""Build and return TestSuite for the whole of bzrlib.
3852
3488
This function can be replaced if you need to change the default test
3853
3489
suite on a global basis, but it is not encouraged.
3493
'bzrlib.tests.blackbox',
3494
'bzrlib.tests.commands',
3495
'bzrlib.tests.per_branch',
3496
'bzrlib.tests.per_bzrdir',
3497
'bzrlib.tests.per_interrepository',
3498
'bzrlib.tests.per_intertree',
3499
'bzrlib.tests.per_inventory',
3500
'bzrlib.tests.per_interbranch',
3501
'bzrlib.tests.per_lock',
3502
'bzrlib.tests.per_transport',
3503
'bzrlib.tests.per_tree',
3504
'bzrlib.tests.per_pack_repository',
3505
'bzrlib.tests.per_repository',
3506
'bzrlib.tests.per_repository_chk',
3507
'bzrlib.tests.per_repository_reference',
3508
'bzrlib.tests.per_versionedfile',
3509
'bzrlib.tests.per_workingtree',
3510
'bzrlib.tests.test__annotator',
3511
'bzrlib.tests.test__chk_map',
3512
'bzrlib.tests.test__dirstate_helpers',
3513
'bzrlib.tests.test__groupcompress',
3514
'bzrlib.tests.test__known_graph',
3515
'bzrlib.tests.test__rio',
3516
'bzrlib.tests.test__walkdirs_win32',
3517
'bzrlib.tests.test_ancestry',
3518
'bzrlib.tests.test_annotate',
3519
'bzrlib.tests.test_api',
3520
'bzrlib.tests.test_atomicfile',
3521
'bzrlib.tests.test_bad_files',
3522
'bzrlib.tests.test_bencode',
3523
'bzrlib.tests.test_bisect_multi',
3524
'bzrlib.tests.test_branch',
3525
'bzrlib.tests.test_branchbuilder',
3526
'bzrlib.tests.test_btree_index',
3527
'bzrlib.tests.test_bugtracker',
3528
'bzrlib.tests.test_bundle',
3529
'bzrlib.tests.test_bzrdir',
3530
'bzrlib.tests.test__chunks_to_lines',
3531
'bzrlib.tests.test_cache_utf8',
3532
'bzrlib.tests.test_chk_map',
3533
'bzrlib.tests.test_chk_serializer',
3534
'bzrlib.tests.test_chunk_writer',
3535
'bzrlib.tests.test_clean_tree',
3536
'bzrlib.tests.test_commands',
3537
'bzrlib.tests.test_commit',
3538
'bzrlib.tests.test_commit_merge',
3539
'bzrlib.tests.test_config',
3540
'bzrlib.tests.test_conflicts',
3541
'bzrlib.tests.test_counted_lock',
3542
'bzrlib.tests.test_crash',
3543
'bzrlib.tests.test_decorators',
3544
'bzrlib.tests.test_delta',
3545
'bzrlib.tests.test_debug',
3546
'bzrlib.tests.test_deprecated_graph',
3547
'bzrlib.tests.test_diff',
3548
'bzrlib.tests.test_directory_service',
3549
'bzrlib.tests.test_dirstate',
3550
'bzrlib.tests.test_email_message',
3551
'bzrlib.tests.test_eol_filters',
3552
'bzrlib.tests.test_errors',
3553
'bzrlib.tests.test_export',
3554
'bzrlib.tests.test_extract',
3555
'bzrlib.tests.test_fetch',
3556
'bzrlib.tests.test_fifo_cache',
3557
'bzrlib.tests.test_filters',
3558
'bzrlib.tests.test_ftp_transport',
3559
'bzrlib.tests.test_foreign',
3560
'bzrlib.tests.test_generate_docs',
3561
'bzrlib.tests.test_generate_ids',
3562
'bzrlib.tests.test_globbing',
3563
'bzrlib.tests.test_gpg',
3564
'bzrlib.tests.test_graph',
3565
'bzrlib.tests.test_groupcompress',
3566
'bzrlib.tests.test_hashcache',
3567
'bzrlib.tests.test_help',
3568
'bzrlib.tests.test_hooks',
3569
'bzrlib.tests.test_http',
3570
'bzrlib.tests.test_http_response',
3571
'bzrlib.tests.test_https_ca_bundle',
3572
'bzrlib.tests.test_identitymap',
3573
'bzrlib.tests.test_ignores',
3574
'bzrlib.tests.test_index',
3575
'bzrlib.tests.test_info',
3576
'bzrlib.tests.test_inv',
3577
'bzrlib.tests.test_inventory_delta',
3578
'bzrlib.tests.test_knit',
3579
'bzrlib.tests.test_lazy_import',
3580
'bzrlib.tests.test_lazy_regex',
3581
'bzrlib.tests.test_lock',
3582
'bzrlib.tests.test_lockable_files',
3583
'bzrlib.tests.test_lockdir',
3584
'bzrlib.tests.test_log',
3585
'bzrlib.tests.test_lru_cache',
3586
'bzrlib.tests.test_lsprof',
3587
'bzrlib.tests.test_mail_client',
3588
'bzrlib.tests.test_memorytree',
3589
'bzrlib.tests.test_merge',
3590
'bzrlib.tests.test_merge3',
3591
'bzrlib.tests.test_merge_core',
3592
'bzrlib.tests.test_merge_directive',
3593
'bzrlib.tests.test_missing',
3594
'bzrlib.tests.test_msgeditor',
3595
'bzrlib.tests.test_multiparent',
3596
'bzrlib.tests.test_mutabletree',
3597
'bzrlib.tests.test_nonascii',
3598
'bzrlib.tests.test_options',
3599
'bzrlib.tests.test_osutils',
3600
'bzrlib.tests.test_osutils_encodings',
3601
'bzrlib.tests.test_pack',
3602
'bzrlib.tests.test_patch',
3603
'bzrlib.tests.test_patches',
3604
'bzrlib.tests.test_permissions',
3605
'bzrlib.tests.test_plugins',
3606
'bzrlib.tests.test_progress',
3607
'bzrlib.tests.test_read_bundle',
3608
'bzrlib.tests.test_reconcile',
3609
'bzrlib.tests.test_reconfigure',
3610
'bzrlib.tests.test_registry',
3611
'bzrlib.tests.test_remote',
3612
'bzrlib.tests.test_rename_map',
3613
'bzrlib.tests.test_repository',
3614
'bzrlib.tests.test_revert',
3615
'bzrlib.tests.test_revision',
3616
'bzrlib.tests.test_revisionspec',
3617
'bzrlib.tests.test_revisiontree',
3618
'bzrlib.tests.test_rio',
3619
'bzrlib.tests.test_rules',
3620
'bzrlib.tests.test_sampler',
3621
'bzrlib.tests.test_selftest',
3622
'bzrlib.tests.test_serializer',
3623
'bzrlib.tests.test_setup',
3624
'bzrlib.tests.test_sftp_transport',
3625
'bzrlib.tests.test_shelf',
3626
'bzrlib.tests.test_shelf_ui',
3627
'bzrlib.tests.test_smart',
3628
'bzrlib.tests.test_smart_add',
3629
'bzrlib.tests.test_smart_request',
3630
'bzrlib.tests.test_smart_transport',
3631
'bzrlib.tests.test_smtp_connection',
3632
'bzrlib.tests.test_source',
3633
'bzrlib.tests.test_ssh_transport',
3634
'bzrlib.tests.test_status',
3635
'bzrlib.tests.test_store',
3636
'bzrlib.tests.test_strace',
3637
'bzrlib.tests.test_subsume',
3638
'bzrlib.tests.test_switch',
3639
'bzrlib.tests.test_symbol_versioning',
3640
'bzrlib.tests.test_tag',
3641
'bzrlib.tests.test_testament',
3642
'bzrlib.tests.test_textfile',
3643
'bzrlib.tests.test_textmerge',
3644
'bzrlib.tests.test_timestamp',
3645
'bzrlib.tests.test_trace',
3646
'bzrlib.tests.test_transactions',
3647
'bzrlib.tests.test_transform',
3648
'bzrlib.tests.test_transport',
3649
'bzrlib.tests.test_transport_log',
3650
'bzrlib.tests.test_tree',
3651
'bzrlib.tests.test_treebuilder',
3652
'bzrlib.tests.test_tsort',
3653
'bzrlib.tests.test_tuned_gzip',
3654
'bzrlib.tests.test_ui',
3655
'bzrlib.tests.test_uncommit',
3656
'bzrlib.tests.test_upgrade',
3657
'bzrlib.tests.test_upgrade_stacked',
3658
'bzrlib.tests.test_urlutils',
3659
'bzrlib.tests.test_version',
3660
'bzrlib.tests.test_version_info',
3661
'bzrlib.tests.test_weave',
3662
'bzrlib.tests.test_whitebox',
3663
'bzrlib.tests.test_win32utils',
3664
'bzrlib.tests.test_workingtree',
3665
'bzrlib.tests.test_workingtree_4',
3666
'bzrlib.tests.test_wsgi',
3667
'bzrlib.tests.test_xml',
3856
3670
loader = TestUtil.TestLoader()
4191
3977
UnicodeFilenameFeature = _UnicodeFilenameFeature()
4194
class _CompatabilityThunkFeature(Feature):
4195
"""This feature is just a thunk to another feature.
4197
It issues a deprecation warning if it is accessed, to let you know that you
4198
should really use a different feature.
4201
def __init__(self, dep_version, module, name,
4202
replacement_name, replacement_module=None):
4203
super(_CompatabilityThunkFeature, self).__init__()
4204
self._module = module
4205
if replacement_module is None:
4206
replacement_module = module
4207
self._replacement_module = replacement_module
4209
self._replacement_name = replacement_name
4210
self._dep_version = dep_version
4211
self._feature = None
4214
if self._feature is None:
4215
depr_msg = self._dep_version % ('%s.%s'
4216
% (self._module, self._name))
4217
use_msg = ' Use %s.%s instead.' % (self._replacement_module,
4218
self._replacement_name)
4219
symbol_versioning.warn(depr_msg + use_msg, DeprecationWarning)
4220
# Import the new feature and use it as a replacement for the
4222
mod = __import__(self._replacement_module, {}, {},
4223
[self._replacement_name])
4224
self._feature = getattr(mod, self._replacement_name)
4228
return self._feature._probe()
4231
class ModuleAvailableFeature(Feature):
4232
"""This is a feature than describes a module we want to be available.
4234
Declare the name of the module in __init__(), and then after probing, the
4235
module will be available as 'self.module'.
4237
:ivar module: The module if it is available, else None.
4240
def __init__(self, module_name):
4241
super(ModuleAvailableFeature, self).__init__()
4242
self.module_name = module_name
4246
self._module = __import__(self.module_name, {}, {}, [''])
4253
if self.available(): # Make sure the probe has been done
4257
def feature_name(self):
4258
return self.module_name
4261
# This is kept here for compatibility, it is recommended to use
4262
# 'bzrlib.tests.feature.paramiko' instead
4263
ParamikoFeature = _CompatabilityThunkFeature(
4264
deprecated_in((2,1,0)),
4265
'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
4268
3980
def probe_unicode_in_user_encoding():
4269
3981
"""Try to encode several unicode strings to use in unicode-aware tests.
4270
3982
Return first successfull match.