/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-01-14 00:01:32 UTC
  • mfrom: (4957.1.1 jam-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20100114000132-3p3rabnonjw3gzqb
(jam) Merge bzr.stable, bringing in bug fixes #175839, #504390

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
"""Tests for the test framework."""
18
18
 
19
19
from cStringIO import StringIO
 
20
from doctest import ELLIPSIS
20
21
import os
21
22
import signal
22
23
import sys
24
25
import unittest
25
26
import warnings
26
27
 
 
28
from testtools import MultiTestResult
 
29
from testtools.content_type import ContentType
 
30
from testtools.matchers import (
 
31
    DocTestMatches,
 
32
    Equals,
 
33
    )
 
34
import testtools.tests.helpers
 
35
 
27
36
import bzrlib
28
37
from bzrlib import (
29
38
    branchbuilder,
38
47
    repository,
39
48
    symbol_versioning,
40
49
    tests,
 
50
    transport,
41
51
    workingtree,
42
52
    )
43
53
from bzrlib.repofmt import (
51
61
    deprecated_method,
52
62
    )
53
63
from bzrlib.tests import (
54
 
    SubUnitFeature,
 
64
    features,
55
65
    test_lsprof,
56
66
    test_sftp_transport,
57
67
    TestUtil,
77
87
                          TestUtil._load_module_by_name,
78
88
                          'bzrlib.no-name-yet')
79
89
 
 
90
 
80
91
class MetaTestLog(tests.TestCase):
81
92
 
82
93
    def test_logging(self):
83
94
        """Test logs are captured when a test fails."""
84
95
        self.log('a test message')
85
 
        self._log_file.flush()
86
 
        self.assertContainsRe(self._get_log(keep_log_file=True),
87
 
                              'a test message\n')
 
96
        details = self.getDetails()
 
97
        log = details['log']
 
98
        self.assertThat(log.content_type, Equals(ContentType(
 
99
            "text", "plain", {"charset": "utf8"})))
 
100
        self.assertThat(u"".join(log.iter_text()), Equals(self.get_log()))
 
101
        self.assertThat(self.get_log(),
 
102
            DocTestMatches(u"...a test message\n", ELLIPSIS))
88
103
 
89
104
 
90
105
class TestUnicodeFilename(tests.TestCase):
489
504
        self.assertEqualStat(real, fake)
490
505
 
491
506
    def test_assertEqualStat_notequal(self):
492
 
        self.build_tree(["foo", "bar"])
 
507
        self.build_tree(["foo", "longname"])
493
508
        self.assertRaises(AssertionError, self.assertEqualStat,
494
 
            os.lstat("foo"), os.lstat("bar"))
 
509
            os.lstat("foo"), os.lstat("longname"))
495
510
 
496
511
 
497
512
class TestTestCaseWithMemoryTransport(tests.TestCaseWithMemoryTransport):
515
530
        cwd = osutils.getcwd()
516
531
        self.assertIsSameRealPath(self.test_dir, cwd)
517
532
 
 
533
    def test_BZR_HOME_and_HOME_are_bytestrings(self):
 
534
        """The $BZR_HOME and $HOME environment variables should not be unicode.
 
535
 
 
536
        See https://bugs.launchpad.net/bzr/+bug/464174
 
537
        """
 
538
        self.assertIsInstance(os.environ['BZR_HOME'], str)
 
539
        self.assertIsInstance(os.environ['HOME'], str)
 
540
 
518
541
    def test_make_branch_and_memory_tree(self):
519
542
        """In TestCaseWithMemoryTransport we should not make the branch on disk.
520
543
 
576
599
                         self.get_transport().get_bytes(
577
600
                            'dir/.bzr/repository/format'))
578
601
 
579
 
    def test_safety_net(self):
580
 
        """No test should modify the safety .bzr directory.
581
 
 
582
 
        We just test that the _check_safety_net private method raises
583
 
        AssertionError, it's easier than building a test suite with the same
584
 
        test.
585
 
        """
586
 
        # Oops, a commit in the current directory (i.e. without local .bzr
587
 
        # directory) will crawl up the hierarchy to find a .bzr directory.
588
 
        self.run_bzr(['commit', '-mfoo', '--unchanged'])
589
 
        # But we have a safety net in place.
590
 
        self.assertRaises(AssertionError, self._check_safety_net)
591
 
 
592
602
    def test_dangling_locks_cause_failures(self):
593
603
        class TestDanglingLock(tests.TestCaseWithMemoryTransport):
594
604
            def test_function(self):
687
697
        self.assertEqual(url, t.clone('..').base)
688
698
 
689
699
 
 
700
class TestProfileResult(tests.TestCase):
 
701
 
 
702
    def test_profiles_tests(self):
 
703
        self.requireFeature(test_lsprof.LSProfFeature)
 
704
        terminal = testtools.tests.helpers.ExtendedTestResult()
 
705
        result = tests.ProfileResult(terminal)
 
706
        class Sample(tests.TestCase):
 
707
            def a(self):
 
708
                self.sample_function()
 
709
            def sample_function(self):
 
710
                pass
 
711
        test = Sample("a")
 
712
        test.run(result)
 
713
        case = terminal._events[0][1]
 
714
        self.assertLength(1, case._benchcalls)
 
715
        # We must be able to unpack it as the test reporting code wants
 
716
        (_, _, _), stats = case._benchcalls[0]
 
717
        self.assertTrue(callable(stats.pprint))
 
718
 
 
719
 
690
720
class TestTestResult(tests.TestCase):
691
721
 
692
722
    def check_timing(self, test_case, expected_re):
694
724
                descriptions=0,
695
725
                verbosity=1,
696
726
                )
697
 
        test_case.run(result)
698
 
        timed_string = result._testTimeString(test_case)
 
727
        capture = testtools.tests.helpers.ExtendedTestResult()
 
728
        test_case.run(MultiTestResult(result, capture))
 
729
        run_case = capture._events[0][1]
 
730
        timed_string = result._testTimeString(run_case)
699
731
        self.assertContainsRe(timed_string, expected_re)
700
732
 
701
733
    def test_test_reporting(self):
719
751
        self.check_timing(ShortDelayTestCase('test_short_delay'),
720
752
                          r"^ +[0-9]+ms$")
721
753
 
 
754
    def _patch_get_bzr_source_tree(self):
 
755
        # Reading from the actual source tree breaks isolation, but we don't
 
756
        # want to assume that thats *all* that would happen.
 
757
        def _get_bzr_source_tree():
 
758
            return None
 
759
        orig_get_bzr_source_tree = bzrlib.version._get_bzr_source_tree
 
760
        bzrlib.version._get_bzr_source_tree = _get_bzr_source_tree
 
761
        def restore():
 
762
            bzrlib.version._get_bzr_source_tree = orig_get_bzr_source_tree
 
763
        self.addCleanup(restore)
 
764
 
722
765
    def test_assigned_benchmark_file_stores_date(self):
 
766
        self._patch_get_bzr_source_tree()
723
767
        output = StringIO()
724
768
        result = bzrlib.tests.TextTestResult(self._log_file,
725
769
                                        descriptions=0,
733
777
        self.assertContainsRe(output_string, "--date [0-9.]+")
734
778
 
735
779
    def test_benchhistory_records_test_times(self):
 
780
        self._patch_get_bzr_source_tree()
736
781
        result_stream = StringIO()
737
782
        result = bzrlib.tests.TextTestResult(
738
783
            self._log_file,
800
845
    def test_known_failure(self):
801
846
        """A KnownFailure being raised should trigger several result actions."""
802
847
        class InstrumentedTestResult(tests.ExtendedTestResult):
803
 
            def done(self): pass
 
848
            def stopTestRun(self): pass
804
849
            def startTests(self): pass
805
850
            def report_test_start(self, test): pass
806
 
            def report_known_failure(self, test, err):
807
 
                self._call = test, err
 
851
            def report_known_failure(self, test, err=None, details=None):
 
852
                self._call = test, 'known failure'
808
853
        result = InstrumentedTestResult(None, None, None, None)
809
 
        def test_function():
810
 
            raise tests.KnownFailure('failed!')
811
 
        test = unittest.FunctionTestCase(test_function)
 
854
        class Test(tests.TestCase):
 
855
            def test_function(self):
 
856
                raise tests.KnownFailure('failed!')
 
857
        test = Test("test_function")
812
858
        test.run(result)
813
859
        # it should invoke 'report_known_failure'.
814
860
        self.assertEqual(2, len(result._call))
815
 
        self.assertEqual(test, result._call[0])
816
 
        self.assertEqual(tests.KnownFailure, result._call[1][0])
817
 
        self.assertIsInstance(result._call[1][1], tests.KnownFailure)
 
861
        self.assertEqual(test.id(), result._call[0].id())
 
862
        self.assertEqual('known failure', result._call[1])
818
863
        # we dont introspec the traceback, if the rest is ok, it would be
819
864
        # exceptional for it not to be.
820
865
        # it should update the known_failure_count on the object.
854
899
    def test_add_not_supported(self):
855
900
        """Test the behaviour of invoking addNotSupported."""
856
901
        class InstrumentedTestResult(tests.ExtendedTestResult):
857
 
            def done(self): pass
 
902
            def stopTestRun(self): pass
858
903
            def startTests(self): pass
859
904
            def report_test_start(self, test): pass
860
905
            def report_unsupported(self, test, feature):
892
937
        result.report_unsupported(test, feature)
893
938
        output = result_stream.getvalue()[prefix:]
894
939
        lines = output.splitlines()
895
 
        # XXX: This is a timing dependent test. I've had it fail because it
896
 
        #      took 6ms to evaluate... :(
897
 
        self.assertEqual(lines, ['NODEP        0ms',
898
 
                                 "    The feature 'Feature' is not available."])
 
940
        # We don't check for the final '0ms' since it may fail on slow hosts
 
941
        self.assertStartsWith(lines[0], 'NODEP')
 
942
        self.assertEqual(lines[1],
 
943
                         "    The feature 'Feature' is not available.")
899
944
 
900
945
    def test_unavailable_exception(self):
901
946
        """An UnavailableFeature being raised should invoke addNotSupported."""
902
947
        class InstrumentedTestResult(tests.ExtendedTestResult):
903
 
            def done(self): pass
 
948
            def stopTestRun(self): pass
904
949
            def startTests(self): pass
905
950
            def report_test_start(self, test): pass
906
951
            def addNotSupported(self, test, feature):
907
952
                self._call = test, feature
908
953
        result = InstrumentedTestResult(None, None, None, None)
909
954
        feature = tests.Feature()
910
 
        def test_function():
911
 
            raise tests.UnavailableFeature(feature)
912
 
        test = unittest.FunctionTestCase(test_function)
 
955
        class Test(tests.TestCase):
 
956
            def test_function(self):
 
957
                raise tests.UnavailableFeature(feature)
 
958
        test = Test("test_function")
913
959
        test.run(result)
914
960
        # it should invoke 'addNotSupported'.
915
961
        self.assertEqual(2, len(result._call))
916
 
        self.assertEqual(test, result._call[0])
 
962
        self.assertEqual(test.id(), result._call[0].id())
917
963
        self.assertEqual(feature, result._call[1])
918
964
        # and not count as an error
919
965
        self.assertEqual(0, result.error_count)
932
978
                                             verbosity=1)
933
979
        test = self.get_passing_test()
934
980
        err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
935
 
        result._addKnownFailure(test, err)
 
981
        result.addExpectedFailure(test, err)
936
982
        self.assertFalse(result.wasStrictlySuccessful())
937
983
        self.assertEqual(None, result._extractBenchmarkTime(test))
938
984
 
983
1029
        because of our use of global state.
984
1030
        """
985
1031
        old_root = tests.TestCaseInTempDir.TEST_ROOT
 
1032
        old_leak = tests.TestCase._first_thread_leaker_id
986
1033
        try:
987
1034
            tests.TestCaseInTempDir.TEST_ROOT = None
 
1035
            tests.TestCase._first_thread_leaker_id = None
988
1036
            return testrunner.run(test)
989
1037
        finally:
990
1038
            tests.TestCaseInTempDir.TEST_ROOT = old_root
 
1039
            tests.TestCase._first_thread_leaker_id = old_leak
991
1040
 
992
1041
    def test_known_failure_failed_run(self):
993
1042
        # run a test that generates a known failure which should be printed in
994
1043
        # the final output when real failures occur.
995
 
        def known_failure_test():
996
 
            raise tests.KnownFailure('failed')
 
1044
        class Test(tests.TestCase):
 
1045
            def known_failure_test(self):
 
1046
                self.expectFailure('failed', self.assertTrue, False)
997
1047
        test = unittest.TestSuite()
998
 
        test.addTest(unittest.FunctionTestCase(known_failure_test))
 
1048
        test.addTest(Test("known_failure_test"))
999
1049
        def failing_test():
1000
 
            raise AssertionError('foo')
 
1050
            self.fail('foo')
1001
1051
        test.addTest(unittest.FunctionTestCase(failing_test))
1002
1052
        stream = StringIO()
1003
1053
        runner = tests.TextTestRunner(stream=stream)
1004
1054
        result = self.run_test_runner(runner, test)
1005
1055
        lines = stream.getvalue().splitlines()
1006
1056
        self.assertContainsRe(stream.getvalue(),
1007
 
            '(?sm)^testing.*$'
 
1057
            '(?sm)^bzr selftest.*$'
1008
1058
            '.*'
1009
1059
            '^======================================================================\n'
1010
1060
            '^FAIL: unittest.FunctionTestCase \\(failing_test\\)\n'
1011
1061
            '^----------------------------------------------------------------------\n'
1012
1062
            'Traceback \\(most recent call last\\):\n'
1013
1063
            '  .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1014
 
            '    raise AssertionError\\(\'foo\'\\)\n'
 
1064
            '    self.fail\\(\'foo\'\\)\n'
1015
1065
            '.*'
1016
1066
            '^----------------------------------------------------------------------\n'
1017
1067
            '.*'
1019
1069
            )
1020
1070
 
1021
1071
    def test_known_failure_ok_run(self):
1022
 
        # run a test that generates a known failure which should be printed in the final output.
1023
 
        def known_failure_test():
1024
 
            raise tests.KnownFailure('failed')
1025
 
        test = unittest.FunctionTestCase(known_failure_test)
 
1072
        # run a test that generates a known failure which should be printed in
 
1073
        # the final output.
 
1074
        class Test(tests.TestCase):
 
1075
            def known_failure_test(self):
 
1076
                self.expectFailure('failed', self.assertTrue, False)
 
1077
        test = Test("known_failure_test")
1026
1078
        stream = StringIO()
1027
1079
        runner = tests.TextTestRunner(stream=stream)
1028
1080
        result = self.run_test_runner(runner, test)
1033
1085
            '\n'
1034
1086
            'OK \\(known_failures=1\\)\n')
1035
1087
 
 
1088
    def test_result_decorator(self):
 
1089
        # decorate results
 
1090
        calls = []
 
1091
        class LoggingDecorator(tests.ForwardingResult):
 
1092
            def startTest(self, test):
 
1093
                tests.ForwardingResult.startTest(self, test)
 
1094
                calls.append('start')
 
1095
        test = unittest.FunctionTestCase(lambda:None)
 
1096
        stream = StringIO()
 
1097
        runner = tests.TextTestRunner(stream=stream,
 
1098
            result_decorators=[LoggingDecorator])
 
1099
        result = self.run_test_runner(runner, test)
 
1100
        self.assertLength(1, calls)
 
1101
 
1036
1102
    def test_skipped_test(self):
1037
1103
        # run a test that is skipped, and check the suite as a whole still
1038
1104
        # succeeds.
1091
1157
 
1092
1158
    def test_not_applicable(self):
1093
1159
        # run a test that is skipped because it's not applicable
1094
 
        def not_applicable_test():
1095
 
            raise tests.TestNotApplicable('this test never runs')
 
1160
        class Test(tests.TestCase):
 
1161
            def not_applicable_test(self):
 
1162
                raise tests.TestNotApplicable('this test never runs')
1096
1163
        out = StringIO()
1097
1164
        runner = tests.TextTestRunner(stream=out, verbosity=2)
1098
 
        test = unittest.FunctionTestCase(not_applicable_test)
 
1165
        test = Test("not_applicable_test")
1099
1166
        result = self.run_test_runner(runner, test)
1100
1167
        self._log_file.write(out.getvalue())
1101
1168
        self.assertTrue(result.wasSuccessful())
1105
1172
        self.assertContainsRe(out.getvalue(),
1106
1173
                r'(?m)^    this test never runs')
1107
1174
 
1108
 
    def test_not_applicable_demo(self):
1109
 
        # just so you can see it in the test output
1110
 
        raise tests.TestNotApplicable('this test is just a demonstation')
1111
 
 
1112
1175
    def test_unsupported_features_listed(self):
1113
1176
        """When unsupported features are encountered they are detailed."""
1114
1177
        class Feature1(tests.Feature):
1134
1197
            ],
1135
1198
            lines[-3:])
1136
1199
 
 
1200
    def _patch_get_bzr_source_tree(self):
 
1201
        # Reading from the actual source tree breaks isolation, but we don't
 
1202
        # want to assume that thats *all* that would happen.
 
1203
        self._get_source_tree_calls = []
 
1204
        def _get_bzr_source_tree():
 
1205
            self._get_source_tree_calls.append("called")
 
1206
            return None
 
1207
        orig_get_bzr_source_tree = bzrlib.version._get_bzr_source_tree
 
1208
        bzrlib.version._get_bzr_source_tree = _get_bzr_source_tree
 
1209
        def restore():
 
1210
            bzrlib.version._get_bzr_source_tree = orig_get_bzr_source_tree
 
1211
        self.addCleanup(restore)
 
1212
 
1137
1213
    def test_bench_history(self):
1138
 
        # tests that the running the benchmark produces a history file
1139
 
        # containing a timestamp and the revision id of the bzrlib source which
1140
 
        # was tested.
1141
 
        workingtree = _get_bzr_source_tree()
 
1214
        # tests that the running the benchmark passes bench_history into
 
1215
        # the test result object. We can tell that happens if
 
1216
        # _get_bzr_source_tree is called.
 
1217
        self._patch_get_bzr_source_tree()
1142
1218
        test = TestRunner('dummy_test')
1143
1219
        output = StringIO()
1144
1220
        runner = tests.TextTestRunner(stream=self._log_file,
1146
1222
        result = self.run_test_runner(runner, test)
1147
1223
        output_string = output.getvalue()
1148
1224
        self.assertContainsRe(output_string, "--date [0-9.]+")
1149
 
        if workingtree is not None:
1150
 
            revision_id = workingtree.get_parent_ids()[0]
1151
 
            self.assertEndsWith(output_string.rstrip(), revision_id)
1152
 
 
1153
 
    def assertLogDeleted(self, test):
1154
 
        log = test._get_log()
1155
 
        self.assertEqual("DELETED log file to reduce memory footprint", log)
1156
 
        self.assertEqual('', test._log_contents)
1157
 
        self.assertIs(None, test._log_file_name)
1158
 
 
1159
 
    def test_success_log_deleted(self):
1160
 
        """Successful tests have their log deleted"""
1161
 
 
1162
 
        class LogTester(tests.TestCase):
1163
 
 
1164
 
            def test_success(self):
1165
 
                self.log('this will be removed\n')
1166
 
 
1167
 
        sio = StringIO()
1168
 
        runner = tests.TextTestRunner(stream=sio)
1169
 
        test = LogTester('test_success')
1170
 
        result = self.run_test_runner(runner, test)
1171
 
 
1172
 
        self.assertLogDeleted(test)
1173
 
 
1174
 
    def test_skipped_log_deleted(self):
1175
 
        """Skipped tests have their log deleted"""
1176
 
 
1177
 
        class LogTester(tests.TestCase):
1178
 
 
1179
 
            def test_skipped(self):
1180
 
                self.log('this will be removed\n')
1181
 
                raise tests.TestSkipped()
1182
 
 
1183
 
        sio = StringIO()
1184
 
        runner = tests.TextTestRunner(stream=sio)
1185
 
        test = LogTester('test_skipped')
1186
 
        result = self.run_test_runner(runner, test)
1187
 
 
1188
 
        self.assertLogDeleted(test)
1189
 
 
1190
 
    def test_not_aplicable_log_deleted(self):
1191
 
        """Not applicable tests have their log deleted"""
1192
 
 
1193
 
        class LogTester(tests.TestCase):
1194
 
 
1195
 
            def test_not_applicable(self):
1196
 
                self.log('this will be removed\n')
1197
 
                raise tests.TestNotApplicable()
1198
 
 
1199
 
        sio = StringIO()
1200
 
        runner = tests.TextTestRunner(stream=sio)
1201
 
        test = LogTester('test_not_applicable')
1202
 
        result = self.run_test_runner(runner, test)
1203
 
 
1204
 
        self.assertLogDeleted(test)
1205
 
 
1206
 
    def test_known_failure_log_deleted(self):
1207
 
        """Know failure tests have their log deleted"""
1208
 
 
1209
 
        class LogTester(tests.TestCase):
1210
 
 
1211
 
            def test_known_failure(self):
1212
 
                self.log('this will be removed\n')
1213
 
                raise tests.KnownFailure()
1214
 
 
1215
 
        sio = StringIO()
1216
 
        runner = tests.TextTestRunner(stream=sio)
1217
 
        test = LogTester('test_known_failure')
1218
 
        result = self.run_test_runner(runner, test)
1219
 
 
1220
 
        self.assertLogDeleted(test)
1221
 
 
1222
 
    def test_fail_log_kept(self):
1223
 
        """Failed tests have their log kept"""
1224
 
 
1225
 
        class LogTester(tests.TestCase):
1226
 
 
1227
 
            def test_fail(self):
1228
 
                self.log('this will be kept\n')
1229
 
                self.fail('this test fails')
1230
 
 
1231
 
        sio = StringIO()
1232
 
        runner = tests.TextTestRunner(stream=sio)
1233
 
        test = LogTester('test_fail')
1234
 
        result = self.run_test_runner(runner, test)
1235
 
 
1236
 
        text = sio.getvalue()
1237
 
        self.assertContainsRe(text, 'this will be kept')
1238
 
        self.assertContainsRe(text, 'this test fails')
1239
 
 
1240
 
        log = test._get_log()
1241
 
        self.assertContainsRe(log, 'this will be kept')
1242
 
        self.assertEqual(log, test._log_contents)
1243
 
 
1244
 
    def test_error_log_kept(self):
1245
 
        """Tests with errors have their log kept"""
1246
 
 
1247
 
        class LogTester(tests.TestCase):
1248
 
 
1249
 
            def test_error(self):
1250
 
                self.log('this will be kept\n')
1251
 
                raise ValueError('random exception raised')
1252
 
 
1253
 
        sio = StringIO()
1254
 
        runner = tests.TextTestRunner(stream=sio)
1255
 
        test = LogTester('test_error')
1256
 
        result = self.run_test_runner(runner, test)
1257
 
 
1258
 
        text = sio.getvalue()
1259
 
        self.assertContainsRe(text, 'this will be kept')
1260
 
        self.assertContainsRe(text, 'random exception raised')
1261
 
 
1262
 
        log = test._get_log()
1263
 
        self.assertContainsRe(log, 'this will be kept')
1264
 
        self.assertEqual(log, test._log_contents)
 
1225
        self.assertLength(1, self._get_source_tree_calls)
 
1226
 
 
1227
    def test_startTestRun(self):
 
1228
        """run should call result.startTestRun()"""
 
1229
        calls = []
 
1230
        class LoggingDecorator(tests.ForwardingResult):
 
1231
            def startTestRun(self):
 
1232
                tests.ForwardingResult.startTestRun(self)
 
1233
                calls.append('startTestRun')
 
1234
        test = unittest.FunctionTestCase(lambda:None)
 
1235
        stream = StringIO()
 
1236
        runner = tests.TextTestRunner(stream=stream,
 
1237
            result_decorators=[LoggingDecorator])
 
1238
        result = self.run_test_runner(runner, test)
 
1239
        self.assertLength(1, calls)
 
1240
 
 
1241
    def test_stopTestRun(self):
 
1242
        """run should call result.stopTestRun()"""
 
1243
        calls = []
 
1244
        class LoggingDecorator(tests.ForwardingResult):
 
1245
            def stopTestRun(self):
 
1246
                tests.ForwardingResult.stopTestRun(self)
 
1247
                calls.append('stopTestRun')
 
1248
        test = unittest.FunctionTestCase(lambda:None)
 
1249
        stream = StringIO()
 
1250
        runner = tests.TextTestRunner(stream=stream,
 
1251
            result_decorators=[LoggingDecorator])
 
1252
        result = self.run_test_runner(runner, test)
 
1253
        self.assertLength(1, calls)
1265
1254
 
1266
1255
 
1267
1256
class SampleTestCase(tests.TestCase):
1404
1393
        self.assertEqual(set(['original-state']), bzrlib.debug.debug_flags)
1405
1394
 
1406
1395
    def make_test_result(self):
 
1396
        """Get a test result that writes to the test log file."""
1407
1397
        return tests.TextTestResult(self._log_file, descriptions=0, verbosity=1)
1408
1398
 
1409
1399
    def inner_test(self):
1417
1407
        result = self.make_test_result()
1418
1408
        self.inner_test.run(result)
1419
1409
        note("outer finish")
 
1410
        self.addCleanup(osutils.delete_any, self._log_file_name)
1420
1411
 
1421
1412
    def test_trace_nesting(self):
1422
1413
        # this tests that each test case nests its trace facility correctly.
1482
1473
        self.assertEqual((time.sleep, (0.003,), {}), self._benchcalls[1][0])
1483
1474
        self.assertIsInstance(self._benchcalls[0][1], bzrlib.lsprof.Stats)
1484
1475
        self.assertIsInstance(self._benchcalls[1][1], bzrlib.lsprof.Stats)
 
1476
        del self._benchcalls[:]
1485
1477
 
1486
1478
    def test_knownFailure(self):
1487
1479
        """Self.knownFailure() should raise a KnownFailure exception."""
1488
1480
        self.assertRaises(tests.KnownFailure, self.knownFailure, "A Failure")
1489
1481
 
 
1482
    def test_open_bzrdir_safe_roots(self):
 
1483
        # even a memory transport should fail to open when its url isn't 
 
1484
        # permitted.
 
1485
        # Manually set one up (TestCase doesn't and shouldn't provide magic
 
1486
        # machinery)
 
1487
        transport_server = MemoryServer()
 
1488
        transport_server.start_server()
 
1489
        self.addCleanup(transport_server.stop_server)
 
1490
        t = transport.get_transport(transport_server.get_url())
 
1491
        bzrdir.BzrDir.create(t.base)
 
1492
        self.assertRaises(errors.BzrError,
 
1493
            bzrdir.BzrDir.open_from_transport, t)
 
1494
        # But if we declare this as safe, we can open the bzrdir.
 
1495
        self.permit_url(t.base)
 
1496
        self._bzr_selftest_roots.append(t.base)
 
1497
        bzrdir.BzrDir.open_from_transport(t)
 
1498
 
1490
1499
    def test_requireFeature_available(self):
1491
1500
        """self.requireFeature(available) is a no-op."""
1492
1501
        class Available(tests.Feature):
1536
1545
        """Test disabled tests behaviour with support aware results."""
1537
1546
        test = SampleTestCase('_test_pass')
1538
1547
        class DisabledFeature(object):
 
1548
            def __eq__(self, other):
 
1549
                return isinstance(other, DisabledFeature)
1539
1550
            def available(self):
1540
1551
                return False
1541
1552
        the_feature = DisabledFeature()
1552
1563
                self.calls.append(('addNotSupported', test, feature))
1553
1564
        result = InstrumentedTestResult()
1554
1565
        test.run(result)
 
1566
        case = result.calls[0][1]
1555
1567
        self.assertEqual([
1556
 
            ('startTest', test),
1557
 
            ('addNotSupported', test, the_feature),
1558
 
            ('stopTest', test),
 
1568
            ('startTest', case),
 
1569
            ('addNotSupported', case, the_feature),
 
1570
            ('stopTest', case),
1559
1571
            ],
1560
1572
            result.calls)
1561
1573
 
 
1574
    def test_start_server_registers_url(self):
 
1575
        transport_server = MemoryServer()
 
1576
        # A little strict, but unlikely to be changed soon.
 
1577
        self.assertEqual([], self._bzr_selftest_roots)
 
1578
        self.start_server(transport_server)
 
1579
        self.assertSubset([transport_server.get_url()],
 
1580
            self._bzr_selftest_roots)
 
1581
 
1562
1582
    def test_assert_list_raises_on_generator(self):
1563
1583
        def generator_which_will_raise():
1564
1584
            # This will not raise until after the first yield
1662
1682
        self.assertEndsWith('foo', 'oo')
1663
1683
        self.assertRaises(AssertionError, self.assertEndsWith, 'o', 'oo')
1664
1684
 
 
1685
    def test_assertEqualDiff(self):
 
1686
        e = self.assertRaises(AssertionError,
 
1687
                              self.assertEqualDiff, '', '\n')
 
1688
        self.assertEquals(str(e),
 
1689
                          # Don't blink ! The '+' applies to the second string
 
1690
                          'first string is missing a final newline.\n+ \n')
 
1691
        e = self.assertRaises(AssertionError,
 
1692
                              self.assertEqualDiff, '\n', '')
 
1693
        self.assertEquals(str(e),
 
1694
                          # Don't blink ! The '-' applies to the second string
 
1695
                          'second string is missing a final newline.\n- \n')
 
1696
 
 
1697
 
 
1698
class TestDeprecations(tests.TestCase):
 
1699
 
1665
1700
    def test_applyDeprecated_not_deprecated(self):
1666
1701
        sample_object = ApplyDeprecatedHelper()
1667
1702
        # calling an undeprecated callable raises an assertion
1744
1779
        tree = self.make_branch_and_memory_tree('a')
1745
1780
        self.assertIsInstance(tree, bzrlib.memorytree.MemoryTree)
1746
1781
 
1747
 
 
1748
 
class TestSFTPMakeBranchAndTree(test_sftp_transport.TestCaseWithSFTPServer):
1749
 
 
1750
 
    def test_make_tree_for_sftp_branch(self):
1751
 
        """Transports backed by local directories create local trees."""
1752
 
        # NB: This is arguably a bug in the definition of make_branch_and_tree.
 
1782
    def test_make_tree_for_local_vfs_backed_transport(self):
 
1783
        # make_branch_and_tree has to use local branch and repositories
 
1784
        # when the vfs transport and local disk are colocated, even if
 
1785
        # a different transport is in use for url generation.
 
1786
        from bzrlib.transport.fakevfat import FakeVFATServer
 
1787
        self.transport_server = FakeVFATServer
 
1788
        self.assertFalse(self.get_url('t1').startswith('file://'))
1753
1789
        tree = self.make_branch_and_tree('t1')
1754
1790
        base = tree.bzrdir.root_transport.base
1755
 
        self.failIf(base.startswith('sftp'),
1756
 
                'base %r is on sftp but should be local' % base)
 
1791
        self.assertStartsWith(base, 'file://')
1757
1792
        self.assertEquals(tree.bzrdir.root_transport,
1758
1793
                tree.branch.bzrdir.root_transport)
1759
1794
        self.assertEquals(tree.bzrdir.root_transport,
1819
1854
        self.assertNotContainsRe("Test.b", output.getvalue())
1820
1855
        self.assertLength(2, output.readlines())
1821
1856
 
 
1857
    def test_lsprof_tests(self):
 
1858
        self.requireFeature(test_lsprof.LSProfFeature)
 
1859
        calls = []
 
1860
        class Test(object):
 
1861
            def __call__(test, result):
 
1862
                test.run(result)
 
1863
            def run(test, result):
 
1864
                self.assertIsInstance(result, tests.ForwardingResult)
 
1865
                calls.append("called")
 
1866
            def countTestCases(self):
 
1867
                return 1
 
1868
        self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
 
1869
        self.assertLength(1, calls)
 
1870
 
1822
1871
    def test_random(self):
1823
1872
        # test randomising by listing a number of tests.
1824
1873
        output_123 = self.run_selftest(test_suite_factory=self.factory,
1839
1888
        self.assertEqual(expected.getvalue(), repeated.getvalue())
1840
1889
 
1841
1890
    def test_runner_class(self):
1842
 
        self.requireFeature(SubUnitFeature)
 
1891
        self.requireFeature(features.subunit)
1843
1892
        from subunit import ProtocolTestCase
1844
1893
        stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
1845
1894
            test_suite_factory=self.factory)
1877
1926
        self.assertEqual(transport_server, captured_transport[0])
1878
1927
 
1879
1928
    def test_transport_sftp(self):
1880
 
        try:
1881
 
            import bzrlib.transport.sftp
1882
 
        except errors.ParamikoNotPresent:
1883
 
            raise tests.TestSkipped("Paramiko not present")
 
1929
        self.requireFeature(features.paramiko)
1884
1930
        self.check_transport_set(bzrlib.transport.sftp.SFTPAbsoluteServer)
1885
1931
 
1886
1932
    def test_transport_memory(self):
1916
1962
 
1917
1963
        Attempts to run bzr from inside this class don't actually run it.
1918
1964
 
1919
 
        We test how run_bzr actually invokes bzr in another location.
1920
 
        Here we only need to test that it is run_bzr passes the right
1921
 
        parameters to run_bzr.
 
1965
        We test how run_bzr actually invokes bzr in another location.  Here we
 
1966
        only need to test that it passes the right parameters to run_bzr.
1922
1967
        """
1923
1968
        self.argv = list(argv)
1924
1969
        self.retcode = retcode
1925
1970
        self.encoding = encoding
1926
1971
        self.stdin = stdin
1927
1972
        self.working_dir = working_dir
1928
 
        return self.out, self.err
 
1973
        return self.retcode, self.out, self.err
1929
1974
 
1930
1975
    def test_run_bzr_error(self):
1931
1976
        self.out = "It sure does!\n"
1932
1977
        out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=34)
1933
1978
        self.assertEqual(['rocks'], self.argv)
1934
1979
        self.assertEqual(34, self.retcode)
1935
 
        self.assertEqual(out, 'It sure does!\n')
 
1980
        self.assertEqual('It sure does!\n', out)
 
1981
        self.assertEquals(out, self.out)
 
1982
        self.assertEqual('', err)
 
1983
        self.assertEquals(err, self.err)
1936
1984
 
1937
1985
    def test_run_bzr_error_regexes(self):
1938
1986
        self.out = ''
1939
1987
        self.err = "bzr: ERROR: foobarbaz is not versioned"
1940
1988
        out, err = self.run_bzr_error(
1941
 
                ["bzr: ERROR: foobarbaz is not versioned"],
1942
 
                ['file-id', 'foobarbaz'])
 
1989
            ["bzr: ERROR: foobarbaz is not versioned"],
 
1990
            ['file-id', 'foobarbaz'])
1943
1991
 
1944
1992
    def test_encoding(self):
1945
1993
        """Test that run_bzr passes encoding to _run_bzr_core"""
2074
2122
        return self.out, self.err
2075
2123
 
2076
2124
 
2077
 
class TestRunBzrSubprocess(tests.TestCaseWithTransport):
 
2125
class TestWithFakedStartBzrSubprocess(tests.TestCaseWithTransport):
 
2126
    """Base class for tests testing how we might run bzr."""
2078
2127
 
2079
2128
    def setUp(self):
2080
2129
        tests.TestCaseWithTransport.setUp(self)
2091
2140
            'working_dir':working_dir, 'allow_plugins':allow_plugins})
2092
2141
        return self.next_subprocess
2093
2142
 
 
2143
 
 
2144
class TestRunBzrSubprocess(TestWithFakedStartBzrSubprocess):
 
2145
 
2094
2146
    def assertRunBzrSubprocess(self, expected_args, process, *args, **kwargs):
2095
2147
        """Run run_bzr_subprocess with args and kwargs using a stubbed process.
2096
2148
 
2159
2211
            StubProcess(), '', allow_plugins=True)
2160
2212
 
2161
2213
 
 
2214
class TestFinishBzrSubprocess(TestWithFakedStartBzrSubprocess):
 
2215
 
 
2216
    def test_finish_bzr_subprocess_with_error(self):
 
2217
        """finish_bzr_subprocess allows specification of the desired exit code.
 
2218
        """
 
2219
        process = StubProcess(err="unknown command", retcode=3)
 
2220
        result = self.finish_bzr_subprocess(process, retcode=3)
 
2221
        self.assertEqual('', result[0])
 
2222
        self.assertContainsRe(result[1], 'unknown command')
 
2223
 
 
2224
    def test_finish_bzr_subprocess_ignoring_retcode(self):
 
2225
        """finish_bzr_subprocess allows the exit code to be ignored."""
 
2226
        process = StubProcess(err="unknown command", retcode=3)
 
2227
        result = self.finish_bzr_subprocess(process, retcode=None)
 
2228
        self.assertEqual('', result[0])
 
2229
        self.assertContainsRe(result[1], 'unknown command')
 
2230
 
 
2231
    def test_finish_subprocess_with_unexpected_retcode(self):
 
2232
        """finish_bzr_subprocess raises self.failureException if the retcode is
 
2233
        not the expected one.
 
2234
        """
 
2235
        process = StubProcess(err="unknown command", retcode=3)
 
2236
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
 
2237
                          process)
 
2238
 
 
2239
 
2162
2240
class _DontSpawnProcess(Exception):
2163
2241
    """A simple exception which just allows us to skip unnecessary steps"""
2164
2242
 
2242
2320
        self.assertEqual(['foo', 'current'], chdirs)
2243
2321
 
2244
2322
 
2245
 
class TestBzrSubprocess(tests.TestCaseWithTransport):
2246
 
 
2247
 
    def test_start_and_stop_bzr_subprocess(self):
2248
 
        """We can start and perform other test actions while that process is
2249
 
        still alive.
2250
 
        """
2251
 
        process = self.start_bzr_subprocess(['--version'])
2252
 
        result = self.finish_bzr_subprocess(process)
2253
 
        self.assertContainsRe(result[0], 'is free software')
2254
 
        self.assertEqual('', result[1])
2255
 
 
2256
 
    def test_start_and_stop_bzr_subprocess_with_error(self):
2257
 
        """finish_bzr_subprocess allows specification of the desired exit code.
2258
 
        """
2259
 
        process = self.start_bzr_subprocess(['--versionn'])
2260
 
        result = self.finish_bzr_subprocess(process, retcode=3)
2261
 
        self.assertEqual('', result[0])
2262
 
        self.assertContainsRe(result[1], 'unknown command')
2263
 
 
2264
 
    def test_start_and_stop_bzr_subprocess_ignoring_retcode(self):
2265
 
        """finish_bzr_subprocess allows the exit code to be ignored."""
2266
 
        process = self.start_bzr_subprocess(['--versionn'])
2267
 
        result = self.finish_bzr_subprocess(process, retcode=None)
2268
 
        self.assertEqual('', result[0])
2269
 
        self.assertContainsRe(result[1], 'unknown command')
2270
 
 
2271
 
    def test_start_and_stop_bzr_subprocess_with_unexpected_retcode(self):
2272
 
        """finish_bzr_subprocess raises self.failureException if the retcode is
2273
 
        not the expected one.
2274
 
        """
2275
 
        process = self.start_bzr_subprocess(['--versionn'])
2276
 
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
2277
 
                          process)
 
2323
class TestActuallyStartBzrSubprocess(tests.TestCaseWithTransport):
 
2324
    """Tests that really need to do things with an external bzr."""
2278
2325
 
2279
2326
    def test_start_and_stop_bzr_subprocess_send_signal(self):
2280
2327
        """finish_bzr_subprocess raises self.failureException if the retcode is
2281
2328
        not the expected one.
2282
2329
        """
 
2330
        self.disable_missing_extensions_warning()
2283
2331
        process = self.start_bzr_subprocess(['wait-until-signalled'],
2284
2332
                                            skip_if_plan_to_signal=True)
2285
2333
        self.assertEqual('running\n', process.stdout.readline())
2288
2336
        self.assertEqual('', result[0])
2289
2337
        self.assertEqual('bzr: interrupted\n', result[1])
2290
2338
 
2291
 
    def test_start_and_stop_working_dir(self):
2292
 
        cwd = osutils.getcwd()
2293
 
        self.make_branch_and_tree('one')
2294
 
        process = self.start_bzr_subprocess(['root'], working_dir='one')
2295
 
        result = self.finish_bzr_subprocess(process, universal_newlines=True)
2296
 
        self.assertEndsWith(result[0], 'one\n')
2297
 
        self.assertEqual('', result[1])
2298
 
 
2299
 
 
2300
 
class TestKnownFailure(tests.TestCase):
2301
 
 
2302
 
    def test_known_failure(self):
2303
 
        """Check that KnownFailure is defined appropriately."""
2304
 
        # a KnownFailure is an assertion error for compatability with unaware
2305
 
        # runners.
2306
 
        self.assertIsInstance(tests.KnownFailure(""), AssertionError)
2307
 
 
2308
 
    def test_expect_failure(self):
2309
 
        try:
2310
 
            self.expectFailure("Doomed to failure", self.assertTrue, False)
2311
 
        except tests.KnownFailure, e:
2312
 
            self.assertEqual('Doomed to failure', e.args[0])
2313
 
        try:
2314
 
            self.expectFailure("Doomed to failure", self.assertTrue, True)
2315
 
        except AssertionError, e:
2316
 
            self.assertEqual('Unexpected success.  Should have failed:'
2317
 
                             ' Doomed to failure', e.args[0])
2318
 
        else:
2319
 
            self.fail('Assertion not raised')
2320
 
 
2321
2339
 
2322
2340
class TestFeature(tests.TestCase):
2323
2341
 
2360
2378
        self.assertIs(feature, exception.args[0])
2361
2379
 
2362
2380
 
 
2381
simple_thunk_feature = tests._CompatabilityThunkFeature(
 
2382
    'bzrlib.tests', 'UnicodeFilename',
 
2383
    'bzrlib.tests.test_selftest.simple_thunk_feature',
 
2384
    deprecated_in((2,1,0)))
 
2385
 
 
2386
class Test_CompatibilityFeature(tests.TestCase):
 
2387
 
 
2388
    def test_does_thunk(self):
 
2389
        res = self.callDeprecated(
 
2390
            ['bzrlib.tests.test_selftest.simple_thunk_feature was deprecated'
 
2391
             ' in version 2.1.0. Use bzrlib.tests.UnicodeFilename instead.'],
 
2392
            simple_thunk_feature.available)
 
2393
        self.assertEqual(tests.UnicodeFilename.available(), res)
 
2394
 
 
2395
        
 
2396
class TestModuleAvailableFeature(tests.TestCase):
 
2397
 
 
2398
    def test_available_module(self):
 
2399
        feature = tests.ModuleAvailableFeature('bzrlib.tests')
 
2400
        self.assertEqual('bzrlib.tests', feature.module_name)
 
2401
        self.assertEqual('bzrlib.tests', str(feature))
 
2402
        self.assertTrue(feature.available())
 
2403
        self.assertIs(tests, feature.module)
 
2404
 
 
2405
    def test_unavailable_module(self):
 
2406
        feature = tests.ModuleAvailableFeature('bzrlib.no_such_module_exists')
 
2407
        self.assertEqual('bzrlib.no_such_module_exists', str(feature))
 
2408
        self.assertFalse(feature.available())
 
2409
        self.assertIs(None, feature.module)
 
2410
 
 
2411
 
2363
2412
class TestSelftestFiltering(tests.TestCase):
2364
2413
 
2365
2414
    def setUp(self):
2544
2593
        # the test framework
2545
2594
        self.assertEquals('always fails', str(e))
2546
2595
        # check that there's no traceback in the test log
2547
 
        self.assertNotContainsRe(self._get_log(keep_log_file=True),
2548
 
            r'Traceback')
 
2596
        self.assertNotContainsRe(self.get_log(), r'Traceback')
2549
2597
 
2550
2598
    def test_run_bzr_user_error_caught(self):
2551
2599
        # Running bzr in blackbox mode, normal/expected/user errors should be
2552
2600
        # caught in the regular way and turned into an error message plus exit
2553
2601
        # code.
2554
 
        out, err = self.run_bzr(["log", "/nonexistantpath"], retcode=3)
 
2602
        transport_server = MemoryServer()
 
2603
        transport_server.start_server()
 
2604
        self.addCleanup(transport_server.stop_server)
 
2605
        url = transport_server.get_url()
 
2606
        self.permit_url(url)
 
2607
        out, err = self.run_bzr(["log", "%s/nonexistantpath" % url], retcode=3)
2555
2608
        self.assertEqual(out, '')
2556
2609
        self.assertContainsRe(err,
2557
2610
            'bzr: ERROR: Not a branch: ".*nonexistantpath/".\n')
2683
2736
 
2684
2737
class TestTestSuite(tests.TestCase):
2685
2738
 
 
2739
    def test__test_suite_testmod_names(self):
 
2740
        # Test that a plausible list of test module names are returned
 
2741
        # by _test_suite_testmod_names.
 
2742
        test_list = tests._test_suite_testmod_names()
 
2743
        self.assertSubset([
 
2744
            'bzrlib.tests.blackbox',
 
2745
            'bzrlib.tests.per_transport',
 
2746
            'bzrlib.tests.test_selftest',
 
2747
            ],
 
2748
            test_list)
 
2749
 
 
2750
    def test__test_suite_modules_to_doctest(self):
 
2751
        # Test that a plausible list of modules to doctest is returned
 
2752
        # by _test_suite_modules_to_doctest.
 
2753
        test_list = tests._test_suite_modules_to_doctest()
 
2754
        self.assertSubset([
 
2755
            'bzrlib.timestamp',
 
2756
            ],
 
2757
            test_list)
 
2758
 
2686
2759
    def test_test_suite(self):
2687
 
        # This test is slow - it loads the entire test suite to operate, so we
2688
 
        # do a single test with one test in each category
2689
 
        test_list = [
 
2760
        # test_suite() loads the entire test suite to operate. To avoid this
 
2761
        # overhead, and yet still be confident that things are happening,
 
2762
        # we temporarily replace two functions used by test_suite with 
 
2763
        # test doubles that supply a few sample tests to load, and check they
 
2764
        # are loaded.
 
2765
        calls = []
 
2766
        def _test_suite_testmod_names():
 
2767
            calls.append("testmod_names")
 
2768
            return [
 
2769
                'bzrlib.tests.blackbox.test_branch',
 
2770
                'bzrlib.tests.per_transport',
 
2771
                'bzrlib.tests.test_selftest',
 
2772
                ]
 
2773
        original_testmod_names = tests._test_suite_testmod_names
 
2774
        def _test_suite_modules_to_doctest():
 
2775
            calls.append("modules_to_doctest")
 
2776
            return ['bzrlib.timestamp']
 
2777
        orig_modules_to_doctest = tests._test_suite_modules_to_doctest
 
2778
        def restore_names():
 
2779
            tests._test_suite_testmod_names = original_testmod_names
 
2780
            tests._test_suite_modules_to_doctest = orig_modules_to_doctest
 
2781
        self.addCleanup(restore_names)
 
2782
        tests._test_suite_testmod_names = _test_suite_testmod_names
 
2783
        tests._test_suite_modules_to_doctest = _test_suite_modules_to_doctest
 
2784
        expected_test_list = [
2690
2785
            # testmod_names
2691
2786
            'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
2692
2787
            ('bzrlib.tests.per_transport.TransportTests'
2693
 
             '.test_abspath(LocalURLServer)'),
 
2788
             '.test_abspath(LocalTransport,LocalURLServer)'),
2694
2789
            'bzrlib.tests.test_selftest.TestTestSuite.test_test_suite',
2695
2790
            # modules_to_doctest
2696
2791
            'bzrlib.timestamp.format_highres_date',
2697
2792
            # plugins can't be tested that way since selftest may be run with
2698
2793
            # --no-plugins
2699
2794
            ]
2700
 
        suite = tests.test_suite(test_list)
2701
 
        self.assertEquals(test_list, _test_ids(suite))
 
2795
        suite = tests.test_suite()
 
2796
        self.assertEqual(set(["testmod_names", "modules_to_doctest"]),
 
2797
            set(calls))
 
2798
        self.assertSubset(expected_test_list, _test_ids(suite))
2702
2799
 
2703
2800
    def test_test_suite_list_and_start(self):
2704
2801
        # We cannot test this at the same time as the main load, because we want
2705
 
        # to know that starting_with == None works. So a second full load is
2706
 
        # incurred.
 
2802
        # to know that starting_with == None works. So a second load is
 
2803
        # incurred - note that the starting_with parameter causes a partial load
 
2804
        # rather than a full load so this test should be pretty quick.
2707
2805
        test_list = ['bzrlib.tests.test_selftest.TestTestSuite.test_test_suite']
2708
2806
        suite = tests.test_suite(test_list,
2709
2807
                                 ['bzrlib.tests.test_selftest.TestTestSuite'])
2754
2852
    def test_load_tests(self):
2755
2853
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2756
2854
        loader = self._create_loader(test_list)
2757
 
 
2758
2855
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2759
2856
        self.assertEquals(test_list, _test_ids(suite))
2760
2857
 
2761
2858
    def test_exclude_tests(self):
2762
2859
        test_list = ['bogus']
2763
2860
        loader = self._create_loader(test_list)
2764
 
 
2765
2861
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2766
2862
        self.assertEquals([], _test_ids(suite))
2767
2863
 
2812
2908
        tpr.register('bar', 'bbb.aaa.rrr')
2813
2909
        tpr.register('bar', 'bBB.aAA.rRR')
2814
2910
        self.assertEquals('bbb.aaa.rrr', tpr.get('bar'))
2815
 
        self.assertContainsRe(self._get_log(keep_log_file=True),
2816
 
                              r'.*bar.*bbb.aaa.rrr.*bBB.aAA.rRR')
 
2911
        self.assertThat(self.get_log(),
 
2912
            DocTestMatches("...bar...bbb.aaa.rrr...BB.aAA.rRR", ELLIPSIS))
2817
2913
 
2818
2914
    def test_get_unknown_prefix(self):
2819
2915
        tpr = self._get_registry()
2855
2951
                                                self.verbosity)
2856
2952
        tests.run_suite(suite, runner_class=MyRunner, stream=StringIO())
2857
2953
        self.assertLength(1, calls)
2858
 
 
2859
 
    def test_done(self):
2860
 
        """run_suite should call result.done()"""
2861
 
        self.calls = 0
2862
 
        def one_more_call(): self.calls += 1
2863
 
        def test_function():
2864
 
            pass
2865
 
        test = unittest.FunctionTestCase(test_function)
2866
 
        class InstrumentedTestResult(tests.ExtendedTestResult):
2867
 
            def done(self): one_more_call()
2868
 
        class MyRunner(tests.TextTestRunner):
2869
 
            def run(self, test):
2870
 
                return InstrumentedTestResult(self.stream, self.descriptions,
2871
 
                                              self.verbosity)
2872
 
        tests.run_suite(test, runner_class=MyRunner, stream=StringIO())
2873
 
        self.assertEquals(1, self.calls)