/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: John Arbash Meinel
  • Date: 2009-12-10 17:16:19 UTC
  • mfrom: (4884 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4889.
  • Revision ID: john@arbash-meinel.com-20091210171619-ehdcxjbl8afhq9g1
Bring in bzr.dev 4884

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
    repository,
39
39
    symbol_versioning,
40
40
    tests,
 
41
    transport,
41
42
    workingtree,
42
43
    )
43
44
from bzrlib.repofmt import (
489
490
        self.assertEqualStat(real, fake)
490
491
 
491
492
    def test_assertEqualStat_notequal(self):
492
 
        self.build_tree(["foo", "bar"])
 
493
        self.build_tree(["foo", "longname"])
493
494
        self.assertRaises(AssertionError, self.assertEqualStat,
494
 
            os.lstat("foo"), os.lstat("bar"))
 
495
            os.lstat("foo"), os.lstat("longname"))
495
496
 
496
497
 
497
498
class TestTestCaseWithMemoryTransport(tests.TestCaseWithMemoryTransport):
515
516
        cwd = osutils.getcwd()
516
517
        self.assertIsSameRealPath(self.test_dir, cwd)
517
518
 
 
519
    def test_BZR_HOME_and_HOME_are_bytestrings(self):
 
520
        """The $BZR_HOME and $HOME environment variables should not be unicode.
 
521
 
 
522
        See https://bugs.launchpad.net/bzr/+bug/464174
 
523
        """
 
524
        self.assertIsInstance(os.environ['BZR_HOME'], str)
 
525
        self.assertIsInstance(os.environ['HOME'], str)
 
526
 
518
527
    def test_make_branch_and_memory_tree(self):
519
528
        """In TestCaseWithMemoryTransport we should not make the branch on disk.
520
529
 
576
585
                         self.get_transport().get_bytes(
577
586
                            'dir/.bzr/repository/format'))
578
587
 
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
588
    def test_dangling_locks_cause_failures(self):
593
589
        class TestDanglingLock(tests.TestCaseWithMemoryTransport):
594
590
            def test_function(self):
687
683
        self.assertEqual(url, t.clone('..').base)
688
684
 
689
685
 
 
686
class TestProfileResult(tests.TestCase):
 
687
 
 
688
    def test_profiles_tests(self):
 
689
        self.requireFeature(test_lsprof.LSProfFeature)
 
690
        terminal = unittest.TestResult()
 
691
        result = tests.ProfileResult(terminal)
 
692
        class Sample(tests.TestCase):
 
693
            def a(self):
 
694
                self.sample_function()
 
695
            def sample_function(self):
 
696
                pass
 
697
        test = Sample("a")
 
698
        test.attrs_to_keep = test.attrs_to_keep + ('_benchcalls',)
 
699
        test.run(result)
 
700
        self.assertLength(1, test._benchcalls)
 
701
        # We must be able to unpack it as the test reporting code wants
 
702
        (_, _, _), stats = test._benchcalls[0]
 
703
        self.assertTrue(callable(stats.pprint))
 
704
 
 
705
 
690
706
class TestTestResult(tests.TestCase):
691
707
 
692
708
    def check_timing(self, test_case, expected_re):
719
735
        self.check_timing(ShortDelayTestCase('test_short_delay'),
720
736
                          r"^ +[0-9]+ms$")
721
737
 
 
738
    def _patch_get_bzr_source_tree(self):
 
739
        # Reading from the actual source tree breaks isolation, but we don't
 
740
        # want to assume that thats *all* that would happen.
 
741
        def _get_bzr_source_tree():
 
742
            return None
 
743
        orig_get_bzr_source_tree = bzrlib.version._get_bzr_source_tree
 
744
        bzrlib.version._get_bzr_source_tree = _get_bzr_source_tree
 
745
        def restore():
 
746
            bzrlib.version._get_bzr_source_tree = orig_get_bzr_source_tree
 
747
        self.addCleanup(restore)
 
748
 
722
749
    def test_assigned_benchmark_file_stores_date(self):
 
750
        self._patch_get_bzr_source_tree()
723
751
        output = StringIO()
724
752
        result = bzrlib.tests.TextTestResult(self._log_file,
725
753
                                        descriptions=0,
733
761
        self.assertContainsRe(output_string, "--date [0-9.]+")
734
762
 
735
763
    def test_benchhistory_records_test_times(self):
 
764
        self._patch_get_bzr_source_tree()
736
765
        result_stream = StringIO()
737
766
        result = bzrlib.tests.TextTestResult(
738
767
            self._log_file,
800
829
    def test_known_failure(self):
801
830
        """A KnownFailure being raised should trigger several result actions."""
802
831
        class InstrumentedTestResult(tests.ExtendedTestResult):
803
 
            def done(self): pass
 
832
            def stopTestRun(self): pass
804
833
            def startTests(self): pass
805
834
            def report_test_start(self, test): pass
806
835
            def report_known_failure(self, test, err):
807
836
                self._call = test, err
808
837
        result = InstrumentedTestResult(None, None, None, None)
809
 
        def test_function():
810
 
            raise tests.KnownFailure('failed!')
811
 
        test = unittest.FunctionTestCase(test_function)
 
838
        class Test(tests.TestCase):
 
839
            def test_function(self):
 
840
                raise tests.KnownFailure('failed!')
 
841
        test = Test("test_function")
812
842
        test.run(result)
813
843
        # it should invoke 'report_known_failure'.
814
844
        self.assertEqual(2, len(result._call))
854
884
    def test_add_not_supported(self):
855
885
        """Test the behaviour of invoking addNotSupported."""
856
886
        class InstrumentedTestResult(tests.ExtendedTestResult):
857
 
            def done(self): pass
 
887
            def stopTestRun(self): pass
858
888
            def startTests(self): pass
859
889
            def report_test_start(self, test): pass
860
890
            def report_unsupported(self, test, feature):
892
922
        result.report_unsupported(test, feature)
893
923
        output = result_stream.getvalue()[prefix:]
894
924
        lines = output.splitlines()
895
 
        self.assertEqual(lines, ['NODEP        0ms',
896
 
                                 "    The feature 'Feature' is not available."])
 
925
        # We don't check for the final '0ms' since it may fail on slow hosts
 
926
        self.assertStartsWith(lines[0], 'NODEP')
 
927
        self.assertEqual(lines[1],
 
928
                         "    The feature 'Feature' is not available.")
897
929
 
898
930
    def test_unavailable_exception(self):
899
931
        """An UnavailableFeature being raised should invoke addNotSupported."""
900
932
        class InstrumentedTestResult(tests.ExtendedTestResult):
901
 
            def done(self): pass
 
933
            def stopTestRun(self): pass
902
934
            def startTests(self): pass
903
935
            def report_test_start(self, test): pass
904
936
            def addNotSupported(self, test, feature):
905
937
                self._call = test, feature
906
938
        result = InstrumentedTestResult(None, None, None, None)
907
939
        feature = tests.Feature()
908
 
        def test_function():
909
 
            raise tests.UnavailableFeature(feature)
910
 
        test = unittest.FunctionTestCase(test_function)
 
940
        class Test(tests.TestCase):
 
941
            def test_function(self):
 
942
                raise tests.UnavailableFeature(feature)
 
943
        test = Test("test_function")
911
944
        test.run(result)
912
945
        # it should invoke 'addNotSupported'.
913
946
        self.assertEqual(2, len(result._call))
930
963
                                             verbosity=1)
931
964
        test = self.get_passing_test()
932
965
        err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
933
 
        result._addKnownFailure(test, err)
 
966
        result.addExpectedFailure(test, err)
934
967
        self.assertFalse(result.wasStrictlySuccessful())
935
968
        self.assertEqual(None, result._extractBenchmarkTime(test))
936
969
 
981
1014
        because of our use of global state.
982
1015
        """
983
1016
        old_root = tests.TestCaseInTempDir.TEST_ROOT
 
1017
        old_leak = tests.TestCase._first_thread_leaker_id
984
1018
        try:
985
1019
            tests.TestCaseInTempDir.TEST_ROOT = None
 
1020
            tests.TestCase._first_thread_leaker_id = None
986
1021
            return testrunner.run(test)
987
1022
        finally:
988
1023
            tests.TestCaseInTempDir.TEST_ROOT = old_root
 
1024
            tests.TestCase._first_thread_leaker_id = old_leak
989
1025
 
990
1026
    def test_known_failure_failed_run(self):
991
1027
        # run a test that generates a known failure which should be printed in
992
1028
        # the final output when real failures occur.
993
 
        def known_failure_test():
994
 
            raise tests.KnownFailure('failed')
 
1029
        class Test(tests.TestCase):
 
1030
            def known_failure_test(self):
 
1031
                raise tests.KnownFailure('failed')
995
1032
        test = unittest.TestSuite()
996
 
        test.addTest(unittest.FunctionTestCase(known_failure_test))
 
1033
        test.addTest(Test("known_failure_test"))
997
1034
        def failing_test():
998
1035
            raise AssertionError('foo')
999
1036
        test.addTest(unittest.FunctionTestCase(failing_test))
1017
1054
            )
1018
1055
 
1019
1056
    def test_known_failure_ok_run(self):
1020
 
        # run a test that generates a known failure which should be printed in the final output.
1021
 
        def known_failure_test():
1022
 
            raise tests.KnownFailure('failed')
1023
 
        test = unittest.FunctionTestCase(known_failure_test)
 
1057
        # run a test that generates a known failure which should be printed in
 
1058
        # the final output.
 
1059
        class Test(tests.TestCase):
 
1060
            def known_failure_test(self):
 
1061
                raise tests.KnownFailure('failed')
 
1062
        test = Test("known_failure_test")
1024
1063
        stream = StringIO()
1025
1064
        runner = tests.TextTestRunner(stream=stream)
1026
1065
        result = self.run_test_runner(runner, test)
1031
1070
            '\n'
1032
1071
            'OK \\(known_failures=1\\)\n')
1033
1072
 
 
1073
    def test_result_decorator(self):
 
1074
        # decorate results
 
1075
        calls = []
 
1076
        class LoggingDecorator(tests.ForwardingResult):
 
1077
            def startTest(self, test):
 
1078
                tests.ForwardingResult.startTest(self, test)
 
1079
                calls.append('start')
 
1080
        test = unittest.FunctionTestCase(lambda:None)
 
1081
        stream = StringIO()
 
1082
        runner = tests.TextTestRunner(stream=stream,
 
1083
            result_decorators=[LoggingDecorator])
 
1084
        result = self.run_test_runner(runner, test)
 
1085
        self.assertLength(1, calls)
 
1086
 
1034
1087
    def test_skipped_test(self):
1035
1088
        # run a test that is skipped, and check the suite as a whole still
1036
1089
        # succeeds.
1089
1142
 
1090
1143
    def test_not_applicable(self):
1091
1144
        # run a test that is skipped because it's not applicable
1092
 
        def not_applicable_test():
1093
 
            raise tests.TestNotApplicable('this test never runs')
 
1145
        class Test(tests.TestCase):
 
1146
            def not_applicable_test(self):
 
1147
                raise tests.TestNotApplicable('this test never runs')
1094
1148
        out = StringIO()
1095
1149
        runner = tests.TextTestRunner(stream=out, verbosity=2)
1096
 
        test = unittest.FunctionTestCase(not_applicable_test)
 
1150
        test = Test("not_applicable_test")
1097
1151
        result = self.run_test_runner(runner, test)
1098
1152
        self._log_file.write(out.getvalue())
1099
1153
        self.assertTrue(result.wasSuccessful())
1103
1157
        self.assertContainsRe(out.getvalue(),
1104
1158
                r'(?m)^    this test never runs')
1105
1159
 
1106
 
    def test_not_applicable_demo(self):
1107
 
        # just so you can see it in the test output
1108
 
        raise tests.TestNotApplicable('this test is just a demonstation')
1109
 
 
1110
1160
    def test_unsupported_features_listed(self):
1111
1161
        """When unsupported features are encountered they are detailed."""
1112
1162
        class Feature1(tests.Feature):
1132
1182
            ],
1133
1183
            lines[-3:])
1134
1184
 
 
1185
    def _patch_get_bzr_source_tree(self):
 
1186
        # Reading from the actual source tree breaks isolation, but we don't
 
1187
        # want to assume that thats *all* that would happen.
 
1188
        self._get_source_tree_calls = []
 
1189
        def _get_bzr_source_tree():
 
1190
            self._get_source_tree_calls.append("called")
 
1191
            return None
 
1192
        orig_get_bzr_source_tree = bzrlib.version._get_bzr_source_tree
 
1193
        bzrlib.version._get_bzr_source_tree = _get_bzr_source_tree
 
1194
        def restore():
 
1195
            bzrlib.version._get_bzr_source_tree = orig_get_bzr_source_tree
 
1196
        self.addCleanup(restore)
 
1197
 
1135
1198
    def test_bench_history(self):
1136
 
        # tests that the running the benchmark produces a history file
1137
 
        # containing a timestamp and the revision id of the bzrlib source which
1138
 
        # was tested.
1139
 
        workingtree = _get_bzr_source_tree()
 
1199
        # tests that the running the benchmark passes bench_history into
 
1200
        # the test result object. We can tell that happens if
 
1201
        # _get_bzr_source_tree is called.
 
1202
        self._patch_get_bzr_source_tree()
1140
1203
        test = TestRunner('dummy_test')
1141
1204
        output = StringIO()
1142
1205
        runner = tests.TextTestRunner(stream=self._log_file,
1144
1207
        result = self.run_test_runner(runner, test)
1145
1208
        output_string = output.getvalue()
1146
1209
        self.assertContainsRe(output_string, "--date [0-9.]+")
1147
 
        if workingtree is not None:
1148
 
            revision_id = workingtree.get_parent_ids()[0]
1149
 
            self.assertEndsWith(output_string.rstrip(), revision_id)
 
1210
        self.assertLength(1, self._get_source_tree_calls)
1150
1211
 
1151
1212
    def assertLogDeleted(self, test):
1152
1213
        log = test._get_log()
1261
1322
        self.assertContainsRe(log, 'this will be kept')
1262
1323
        self.assertEqual(log, test._log_contents)
1263
1324
 
 
1325
    def test_startTestRun(self):
 
1326
        """run should call result.startTestRun()"""
 
1327
        calls = []
 
1328
        class LoggingDecorator(tests.ForwardingResult):
 
1329
            def startTestRun(self):
 
1330
                tests.ForwardingResult.startTestRun(self)
 
1331
                calls.append('startTestRun')
 
1332
        test = unittest.FunctionTestCase(lambda:None)
 
1333
        stream = StringIO()
 
1334
        runner = tests.TextTestRunner(stream=stream,
 
1335
            result_decorators=[LoggingDecorator])
 
1336
        result = self.run_test_runner(runner, test)
 
1337
        self.assertLength(1, calls)
 
1338
 
 
1339
    def test_stopTestRun(self):
 
1340
        """run should call result.stopTestRun()"""
 
1341
        calls = []
 
1342
        class LoggingDecorator(tests.ForwardingResult):
 
1343
            def stopTestRun(self):
 
1344
                tests.ForwardingResult.stopTestRun(self)
 
1345
                calls.append('stopTestRun')
 
1346
        test = unittest.FunctionTestCase(lambda:None)
 
1347
        stream = StringIO()
 
1348
        runner = tests.TextTestRunner(stream=stream,
 
1349
            result_decorators=[LoggingDecorator])
 
1350
        result = self.run_test_runner(runner, test)
 
1351
        self.assertLength(1, calls)
 
1352
 
1264
1353
 
1265
1354
class SampleTestCase(tests.TestCase):
1266
1355
 
1432
1521
        outer_test = TestTestCase("outer_child")
1433
1522
        result = self.make_test_result()
1434
1523
        outer_test.run(result)
 
1524
        self.addCleanup(osutils.delete_any, outer_test._log_file_name)
1435
1525
        self.assertEqual(original_trace, bzrlib.trace._trace_file)
1436
1526
 
1437
1527
    def method_that_times_a_bit_twice(self):
1480
1570
        self.assertEqual((time.sleep, (0.003,), {}), self._benchcalls[1][0])
1481
1571
        self.assertIsInstance(self._benchcalls[0][1], bzrlib.lsprof.Stats)
1482
1572
        self.assertIsInstance(self._benchcalls[1][1], bzrlib.lsprof.Stats)
 
1573
        del self._benchcalls[:]
1483
1574
 
1484
1575
    def test_knownFailure(self):
1485
1576
        """Self.knownFailure() should raise a KnownFailure exception."""
1486
1577
        self.assertRaises(tests.KnownFailure, self.knownFailure, "A Failure")
1487
1578
 
 
1579
    def test_open_bzrdir_safe_roots(self):
 
1580
        # even a memory transport should fail to open when its url isn't 
 
1581
        # permitted.
 
1582
        # Manually set one up (TestCase doesn't and shouldn't provide magic
 
1583
        # machinery)
 
1584
        transport_server = MemoryServer()
 
1585
        transport_server.setUp()
 
1586
        self.addCleanup(transport_server.tearDown)
 
1587
        t = transport.get_transport(transport_server.get_url())
 
1588
        bzrdir.BzrDir.create(t.base)
 
1589
        self.assertRaises(errors.BzrError,
 
1590
            bzrdir.BzrDir.open_from_transport, t)
 
1591
        # But if we declare this as safe, we can open the bzrdir.
 
1592
        self.permit_url(t.base)
 
1593
        self._bzr_selftest_roots.append(t.base)
 
1594
        bzrdir.BzrDir.open_from_transport(t)
 
1595
 
1488
1596
    def test_requireFeature_available(self):
1489
1597
        """self.requireFeature(available) is a no-op."""
1490
1598
        class Available(tests.Feature):
1557
1665
            ],
1558
1666
            result.calls)
1559
1667
 
 
1668
    def test_start_server_registers_url(self):
 
1669
        transport_server = MemoryServer()
 
1670
        # A little strict, but unlikely to be changed soon.
 
1671
        self.assertEqual([], self._bzr_selftest_roots)
 
1672
        self.start_server(transport_server)
 
1673
        self.assertSubset([transport_server.get_url()],
 
1674
            self._bzr_selftest_roots)
 
1675
 
1560
1676
    def test_assert_list_raises_on_generator(self):
1561
1677
        def generator_which_will_raise():
1562
1678
            # This will not raise until after the first yield
1660
1776
        self.assertEndsWith('foo', 'oo')
1661
1777
        self.assertRaises(AssertionError, self.assertEndsWith, 'o', 'oo')
1662
1778
 
 
1779
    def test_assertEqualDiff(self):
 
1780
        e = self.assertRaises(AssertionError,
 
1781
                              self.assertEqualDiff, '', '\n')
 
1782
        self.assertEquals(str(e),
 
1783
                          # Don't blink ! The '+' applies to the second string
 
1784
                          'first string is missing a final newline.\n+ \n')
 
1785
        e = self.assertRaises(AssertionError,
 
1786
                              self.assertEqualDiff, '\n', '')
 
1787
        self.assertEquals(str(e),
 
1788
                          # Don't blink ! The '-' applies to the second string
 
1789
                          'second string is missing a final newline.\n- \n')
 
1790
 
 
1791
 
 
1792
class TestDeprecations(tests.TestCase):
 
1793
 
1663
1794
    def test_applyDeprecated_not_deprecated(self):
1664
1795
        sample_object = ApplyDeprecatedHelper()
1665
1796
        # calling an undeprecated callable raises an assertion
1742
1873
        tree = self.make_branch_and_memory_tree('a')
1743
1874
        self.assertIsInstance(tree, bzrlib.memorytree.MemoryTree)
1744
1875
 
1745
 
 
1746
 
class TestSFTPMakeBranchAndTree(test_sftp_transport.TestCaseWithSFTPServer):
1747
 
 
1748
 
    def test_make_tree_for_sftp_branch(self):
1749
 
        """Transports backed by local directories create local trees."""
1750
 
        # NB: This is arguably a bug in the definition of make_branch_and_tree.
 
1876
    def test_make_tree_for_local_vfs_backed_transport(self):
 
1877
        # make_branch_and_tree has to use local branch and repositories
 
1878
        # when the vfs transport and local disk are colocated, even if
 
1879
        # a different transport is in use for url generation.
 
1880
        from bzrlib.transport.fakevfat import FakeVFATServer
 
1881
        self.transport_server = FakeVFATServer
 
1882
        self.assertFalse(self.get_url('t1').startswith('file://'))
1751
1883
        tree = self.make_branch_and_tree('t1')
1752
1884
        base = tree.bzrdir.root_transport.base
1753
 
        self.failIf(base.startswith('sftp'),
1754
 
                'base %r is on sftp but should be local' % base)
 
1885
        self.assertStartsWith(base, 'file://')
1755
1886
        self.assertEquals(tree.bzrdir.root_transport,
1756
1887
                tree.branch.bzrdir.root_transport)
1757
1888
        self.assertEquals(tree.bzrdir.root_transport,
1817
1948
        self.assertNotContainsRe("Test.b", output.getvalue())
1818
1949
        self.assertLength(2, output.readlines())
1819
1950
 
 
1951
    def test_lsprof_tests(self):
 
1952
        self.requireFeature(test_lsprof.LSProfFeature)
 
1953
        calls = []
 
1954
        class Test(object):
 
1955
            def __call__(test, result):
 
1956
                test.run(result)
 
1957
            def run(test, result):
 
1958
                self.assertIsInstance(result, tests.ForwardingResult)
 
1959
                calls.append("called")
 
1960
            def countTestCases(self):
 
1961
                return 1
 
1962
        self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
 
1963
        self.assertLength(1, calls)
 
1964
 
1820
1965
    def test_random(self):
1821
1966
        # test randomising by listing a number of tests.
1822
1967
        output_123 = self.run_selftest(test_suite_factory=self.factory,
1914
2059
 
1915
2060
        Attempts to run bzr from inside this class don't actually run it.
1916
2061
 
1917
 
        We test how run_bzr actually invokes bzr in another location.
1918
 
        Here we only need to test that it is run_bzr passes the right
1919
 
        parameters to run_bzr.
 
2062
        We test how run_bzr actually invokes bzr in another location.  Here we
 
2063
        only need to test that it passes the right parameters to run_bzr.
1920
2064
        """
1921
2065
        self.argv = list(argv)
1922
2066
        self.retcode = retcode
1923
2067
        self.encoding = encoding
1924
2068
        self.stdin = stdin
1925
2069
        self.working_dir = working_dir
1926
 
        return self.out, self.err
 
2070
        return self.retcode, self.out, self.err
1927
2071
 
1928
2072
    def test_run_bzr_error(self):
1929
2073
        self.out = "It sure does!\n"
1930
2074
        out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=34)
1931
2075
        self.assertEqual(['rocks'], self.argv)
1932
2076
        self.assertEqual(34, self.retcode)
1933
 
        self.assertEqual(out, 'It sure does!\n')
 
2077
        self.assertEqual('It sure does!\n', out)
 
2078
        self.assertEquals(out, self.out)
 
2079
        self.assertEqual('', err)
 
2080
        self.assertEquals(err, self.err)
1934
2081
 
1935
2082
    def test_run_bzr_error_regexes(self):
1936
2083
        self.out = ''
1937
2084
        self.err = "bzr: ERROR: foobarbaz is not versioned"
1938
2085
        out, err = self.run_bzr_error(
1939
 
                ["bzr: ERROR: foobarbaz is not versioned"],
1940
 
                ['file-id', 'foobarbaz'])
 
2086
            ["bzr: ERROR: foobarbaz is not versioned"],
 
2087
            ['file-id', 'foobarbaz'])
1941
2088
 
1942
2089
    def test_encoding(self):
1943
2090
        """Test that run_bzr passes encoding to _run_bzr_core"""
2072
2219
        return self.out, self.err
2073
2220
 
2074
2221
 
2075
 
class TestRunBzrSubprocess(tests.TestCaseWithTransport):
 
2222
class TestWithFakedStartBzrSubprocess(tests.TestCaseWithTransport):
 
2223
    """Base class for tests testing how we might run bzr."""
2076
2224
 
2077
2225
    def setUp(self):
2078
2226
        tests.TestCaseWithTransport.setUp(self)
2089
2237
            'working_dir':working_dir, 'allow_plugins':allow_plugins})
2090
2238
        return self.next_subprocess
2091
2239
 
 
2240
 
 
2241
class TestRunBzrSubprocess(TestWithFakedStartBzrSubprocess):
 
2242
 
2092
2243
    def assertRunBzrSubprocess(self, expected_args, process, *args, **kwargs):
2093
2244
        """Run run_bzr_subprocess with args and kwargs using a stubbed process.
2094
2245
 
2157
2308
            StubProcess(), '', allow_plugins=True)
2158
2309
 
2159
2310
 
 
2311
class TestFinishBzrSubprocess(TestWithFakedStartBzrSubprocess):
 
2312
 
 
2313
    def test_finish_bzr_subprocess_with_error(self):
 
2314
        """finish_bzr_subprocess allows specification of the desired exit code.
 
2315
        """
 
2316
        process = StubProcess(err="unknown command", retcode=3)
 
2317
        result = self.finish_bzr_subprocess(process, retcode=3)
 
2318
        self.assertEqual('', result[0])
 
2319
        self.assertContainsRe(result[1], 'unknown command')
 
2320
 
 
2321
    def test_finish_bzr_subprocess_ignoring_retcode(self):
 
2322
        """finish_bzr_subprocess allows the exit code to be ignored."""
 
2323
        process = StubProcess(err="unknown command", retcode=3)
 
2324
        result = self.finish_bzr_subprocess(process, retcode=None)
 
2325
        self.assertEqual('', result[0])
 
2326
        self.assertContainsRe(result[1], 'unknown command')
 
2327
 
 
2328
    def test_finish_subprocess_with_unexpected_retcode(self):
 
2329
        """finish_bzr_subprocess raises self.failureException if the retcode is
 
2330
        not the expected one.
 
2331
        """
 
2332
        process = StubProcess(err="unknown command", retcode=3)
 
2333
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
 
2334
                          process)
 
2335
 
 
2336
 
2160
2337
class _DontSpawnProcess(Exception):
2161
2338
    """A simple exception which just allows us to skip unnecessary steps"""
2162
2339
 
2240
2417
        self.assertEqual(['foo', 'current'], chdirs)
2241
2418
 
2242
2419
 
2243
 
class TestBzrSubprocess(tests.TestCaseWithTransport):
2244
 
 
2245
 
    def test_start_and_stop_bzr_subprocess(self):
2246
 
        """We can start and perform other test actions while that process is
2247
 
        still alive.
2248
 
        """
2249
 
        process = self.start_bzr_subprocess(['--version'])
2250
 
        result = self.finish_bzr_subprocess(process)
2251
 
        self.assertContainsRe(result[0], 'is free software')
2252
 
        self.assertEqual('', result[1])
2253
 
 
2254
 
    def test_start_and_stop_bzr_subprocess_with_error(self):
2255
 
        """finish_bzr_subprocess allows specification of the desired exit code.
2256
 
        """
2257
 
        process = self.start_bzr_subprocess(['--versionn'])
2258
 
        result = self.finish_bzr_subprocess(process, retcode=3)
2259
 
        self.assertEqual('', result[0])
2260
 
        self.assertContainsRe(result[1], 'unknown command')
2261
 
 
2262
 
    def test_start_and_stop_bzr_subprocess_ignoring_retcode(self):
2263
 
        """finish_bzr_subprocess allows the exit code to be ignored."""
2264
 
        process = self.start_bzr_subprocess(['--versionn'])
2265
 
        result = self.finish_bzr_subprocess(process, retcode=None)
2266
 
        self.assertEqual('', result[0])
2267
 
        self.assertContainsRe(result[1], 'unknown command')
2268
 
 
2269
 
    def test_start_and_stop_bzr_subprocess_with_unexpected_retcode(self):
2270
 
        """finish_bzr_subprocess raises self.failureException if the retcode is
2271
 
        not the expected one.
2272
 
        """
2273
 
        process = self.start_bzr_subprocess(['--versionn'])
2274
 
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
2275
 
                          process)
 
2420
class TestActuallyStartBzrSubprocess(tests.TestCaseWithTransport):
 
2421
    """Tests that really need to do things with an external bzr."""
2276
2422
 
2277
2423
    def test_start_and_stop_bzr_subprocess_send_signal(self):
2278
2424
        """finish_bzr_subprocess raises self.failureException if the retcode is
2279
2425
        not the expected one.
2280
2426
        """
 
2427
        self.disable_missing_extensions_warning()
2281
2428
        process = self.start_bzr_subprocess(['wait-until-signalled'],
2282
2429
                                            skip_if_plan_to_signal=True)
2283
2430
        self.assertEqual('running\n', process.stdout.readline())
2286
2433
        self.assertEqual('', result[0])
2287
2434
        self.assertEqual('bzr: interrupted\n', result[1])
2288
2435
 
2289
 
    def test_start_and_stop_working_dir(self):
2290
 
        cwd = osutils.getcwd()
2291
 
        self.make_branch_and_tree('one')
2292
 
        process = self.start_bzr_subprocess(['root'], working_dir='one')
2293
 
        result = self.finish_bzr_subprocess(process, universal_newlines=True)
2294
 
        self.assertEndsWith(result[0], 'one\n')
2295
 
        self.assertEqual('', result[1])
2296
 
 
2297
2436
 
2298
2437
class TestKnownFailure(tests.TestCase):
2299
2438
 
2358
2497
        self.assertIs(feature, exception.args[0])
2359
2498
 
2360
2499
 
 
2500
class TestModuleAvailableFeature(tests.TestCase):
 
2501
 
 
2502
    def test_available_module(self):
 
2503
        feature = tests.ModuleAvailableFeature('bzrlib.tests')
 
2504
        self.assertEqual('bzrlib.tests', feature.module_name)
 
2505
        self.assertEqual('bzrlib.tests', str(feature))
 
2506
        self.assertTrue(feature.available())
 
2507
        self.assertIs(tests, feature.module)
 
2508
 
 
2509
    def test_unavailable_module(self):
 
2510
        feature = tests.ModuleAvailableFeature('bzrlib.no_such_module_exists')
 
2511
        self.assertEqual('bzrlib.no_such_module_exists', str(feature))
 
2512
        self.assertFalse(feature.available())
 
2513
        self.assertIs(None, feature.module)
 
2514
 
 
2515
 
2361
2516
class TestSelftestFiltering(tests.TestCase):
2362
2517
 
2363
2518
    def setUp(self):
2549
2704
        # Running bzr in blackbox mode, normal/expected/user errors should be
2550
2705
        # caught in the regular way and turned into an error message plus exit
2551
2706
        # code.
2552
 
        out, err = self.run_bzr(["log", "/nonexistantpath"], retcode=3)
 
2707
        transport_server = MemoryServer()
 
2708
        transport_server.setUp()
 
2709
        self.addCleanup(transport_server.tearDown)
 
2710
        url = transport_server.get_url()
 
2711
        self.permit_url(url)
 
2712
        out, err = self.run_bzr(["log", "%s/nonexistantpath" % url], retcode=3)
2553
2713
        self.assertEqual(out, '')
2554
2714
        self.assertContainsRe(err,
2555
2715
            'bzr: ERROR: Not a branch: ".*nonexistantpath/".\n')
2681
2841
 
2682
2842
class TestTestSuite(tests.TestCase):
2683
2843
 
 
2844
    def test__test_suite_testmod_names(self):
 
2845
        # Test that a plausible list of test module names are returned
 
2846
        # by _test_suite_testmod_names.
 
2847
        test_list = tests._test_suite_testmod_names()
 
2848
        self.assertSubset([
 
2849
            'bzrlib.tests.blackbox',
 
2850
            'bzrlib.tests.per_transport',
 
2851
            'bzrlib.tests.test_selftest',
 
2852
            ],
 
2853
            test_list)
 
2854
 
 
2855
    def test__test_suite_modules_to_doctest(self):
 
2856
        # Test that a plausible list of modules to doctest is returned
 
2857
        # by _test_suite_modules_to_doctest.
 
2858
        test_list = tests._test_suite_modules_to_doctest()
 
2859
        self.assertSubset([
 
2860
            'bzrlib.timestamp',
 
2861
            ],
 
2862
            test_list)
 
2863
 
2684
2864
    def test_test_suite(self):
2685
 
        # This test is slow - it loads the entire test suite to operate, so we
2686
 
        # do a single test with one test in each category
2687
 
        test_list = [
 
2865
        # test_suite() loads the entire test suite to operate. To avoid this
 
2866
        # overhead, and yet still be confident that things are happening,
 
2867
        # we temporarily replace two functions used by test_suite with 
 
2868
        # test doubles that supply a few sample tests to load, and check they
 
2869
        # are loaded.
 
2870
        calls = []
 
2871
        def _test_suite_testmod_names():
 
2872
            calls.append("testmod_names")
 
2873
            return [
 
2874
                'bzrlib.tests.blackbox.test_branch',
 
2875
                'bzrlib.tests.per_transport',
 
2876
                'bzrlib.tests.test_selftest',
 
2877
                ]
 
2878
        original_testmod_names = tests._test_suite_testmod_names
 
2879
        def _test_suite_modules_to_doctest():
 
2880
            calls.append("modules_to_doctest")
 
2881
            return ['bzrlib.timestamp']
 
2882
        orig_modules_to_doctest = tests._test_suite_modules_to_doctest
 
2883
        def restore_names():
 
2884
            tests._test_suite_testmod_names = original_testmod_names
 
2885
            tests._test_suite_modules_to_doctest = orig_modules_to_doctest
 
2886
        self.addCleanup(restore_names)
 
2887
        tests._test_suite_testmod_names = _test_suite_testmod_names
 
2888
        tests._test_suite_modules_to_doctest = _test_suite_modules_to_doctest
 
2889
        expected_test_list = [
2688
2890
            # testmod_names
2689
2891
            'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
2690
2892
            ('bzrlib.tests.per_transport.TransportTests'
2691
 
             '.test_abspath(LocalURLServer)'),
 
2893
             '.test_abspath(LocalTransport,LocalURLServer)'),
2692
2894
            'bzrlib.tests.test_selftest.TestTestSuite.test_test_suite',
2693
2895
            # modules_to_doctest
2694
2896
            'bzrlib.timestamp.format_highres_date',
2695
2897
            # plugins can't be tested that way since selftest may be run with
2696
2898
            # --no-plugins
2697
2899
            ]
2698
 
        suite = tests.test_suite(test_list)
2699
 
        self.assertEquals(test_list, _test_ids(suite))
 
2900
        suite = tests.test_suite()
 
2901
        self.assertEqual(set(["testmod_names", "modules_to_doctest"]),
 
2902
            set(calls))
 
2903
        self.assertSubset(expected_test_list, _test_ids(suite))
2700
2904
 
2701
2905
    def test_test_suite_list_and_start(self):
2702
2906
        # We cannot test this at the same time as the main load, because we want
2703
 
        # to know that starting_with == None works. So a second full load is
2704
 
        # incurred.
 
2907
        # to know that starting_with == None works. So a second load is
 
2908
        # incurred - note that the starting_with parameter causes a partial load
 
2909
        # rather than a full load so this test should be pretty quick.
2705
2910
        test_list = ['bzrlib.tests.test_selftest.TestTestSuite.test_test_suite']
2706
2911
        suite = tests.test_suite(test_list,
2707
2912
                                 ['bzrlib.tests.test_selftest.TestTestSuite'])
2853
3058
                                                self.verbosity)
2854
3059
        tests.run_suite(suite, runner_class=MyRunner, stream=StringIO())
2855
3060
        self.assertLength(1, calls)
2856
 
 
2857
 
    def test_done(self):
2858
 
        """run_suite should call result.done()"""
2859
 
        self.calls = 0
2860
 
        def one_more_call(): self.calls += 1
2861
 
        def test_function():
2862
 
            pass
2863
 
        test = unittest.FunctionTestCase(test_function)
2864
 
        class InstrumentedTestResult(tests.ExtendedTestResult):
2865
 
            def done(self): one_more_call()
2866
 
        class MyRunner(tests.TextTestRunner):
2867
 
            def run(self, test):
2868
 
                return InstrumentedTestResult(self.stream, self.descriptions,
2869
 
                                              self.verbosity)
2870
 
        tests.run_suite(test, runner_class=MyRunner, stream=StringIO())
2871
 
        self.assertEquals(1, self.calls)