~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-05-11 15:04:23 UTC
  • mfrom: (5848.1.1 2.4-cython-first)
  • Revision ID: pqm@pqm.ubuntu.com-20110511150423-tpm1ablukqalkvim
(jameinel) Default to using Cython for compiling code,
 rather than Pyrex. (John A Meinel)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2013, 2016 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
"""Tests for the test framework."""
18
18
 
19
19
from cStringIO import StringIO
20
 
import gc
21
20
import doctest
22
21
import os
23
22
import signal
37
36
    DocTestMatches,
38
37
    Equals,
39
38
    )
40
 
import testtools.testresult.doubles
 
39
import testtools.tests.helpers
41
40
 
42
41
import bzrlib
43
42
from bzrlib import (
44
43
    branchbuilder,
45
44
    bzrdir,
46
 
    controldir,
47
45
    errors,
48
 
    hooks,
49
46
    lockdir,
50
47
    memorytree,
51
48
    osutils,
95
92
            DocTestMatches(u"...a test message\n", doctest.ELLIPSIS))
96
93
 
97
94
 
 
95
class TestUnicodeFilename(tests.TestCase):
 
96
 
 
97
    def test_probe_passes(self):
 
98
        """UnicodeFilename._probe passes."""
 
99
        # We can't test much more than that because the behaviour depends
 
100
        # on the platform.
 
101
        tests.UnicodeFilename._probe()
 
102
 
 
103
 
98
104
class TestTreeShape(tests.TestCaseInTempDir):
99
105
 
100
106
    def test_unicode_paths(self):
101
 
        self.requireFeature(features.UnicodeFilenameFeature)
 
107
        self.requireFeature(tests.UnicodeFilename)
102
108
 
103
109
        filename = u'hell\u00d8'
104
110
        self.build_tree_contents([(filename, 'contents of hello')])
335
341
        server1 = "a"
336
342
        server2 = "b"
337
343
        formats = [workingtree_4.WorkingTreeFormat4(),
338
 
                   workingtree_3.WorkingTreeFormat3(),
339
 
                   workingtree_4.WorkingTreeFormat6()]
340
 
        scenarios = make_scenarios(server1, server2, formats,
341
 
            remote_server='c', remote_readonly_server='d',
342
 
            remote_backing_server='e')
 
344
                   workingtree_3.WorkingTreeFormat3(),]
 
345
        scenarios = make_scenarios(server1, server2, formats)
343
346
        self.assertEqual([
344
347
            ('WorkingTreeFormat4',
345
348
             {'bzrdir_format': formats[0]._matchingbzrdir,
350
353
             {'bzrdir_format': formats[1]._matchingbzrdir,
351
354
              'transport_readonly_server': 'b',
352
355
              'transport_server': 'a',
353
 
              'workingtree_format': formats[1]}),
354
 
            ('WorkingTreeFormat6',
355
 
             {'bzrdir_format': formats[2]._matchingbzrdir,
356
 
              'transport_readonly_server': 'b',
357
 
              'transport_server': 'a',
358
 
              'workingtree_format': formats[2]}),
359
 
            ('WorkingTreeFormat6,remote',
360
 
             {'bzrdir_format': formats[2]._matchingbzrdir,
361
 
              'repo_is_remote': True,
362
 
              'transport_readonly_server': 'd',
363
 
              'transport_server': 'c',
364
 
              'vfs_transport_factory': 'e',
365
 
              'workingtree_format': formats[2]}),
366
 
            ], scenarios)
 
356
              'workingtree_format': formats[1]})],
 
357
            scenarios)
367
358
 
368
359
 
369
360
class TestTreeScenarios(tests.TestCase):
370
361
 
371
362
    def test_scenarios(self):
372
363
        # the tree implementation scenario generator is meant to setup one
373
 
        # instance for each working tree format, one additional instance
 
364
        # instance for each working tree format, and one additional instance
374
365
        # that will use the default wt format, but create a revision tree for
375
 
        # the tests, and one more that uses the default wt format as a
376
 
        # lightweight checkout of a remote repository.  This means that the wt
377
 
        # ones should have the workingtree_to_test_tree attribute set to
378
 
        # 'return_parameter' and the revision one set to
379
 
        # revision_tree_from_workingtree.
 
366
        # the tests.  this means that the wt ones should have the
 
367
        # workingtree_to_test_tree attribute set to 'return_parameter' and the
 
368
        # revision one set to revision_tree_from_workingtree.
380
369
 
381
370
        from bzrlib.tests.per_tree import (
382
371
            _dirstate_tree_from_workingtree,
388
377
            )
389
378
        server1 = "a"
390
379
        server2 = "b"
391
 
        smart_server = test_server.SmartTCPServer_for_testing
392
 
        smart_readonly_server = test_server.ReadonlySmartTCPServer_for_testing
393
 
        mem_server = memory.MemoryServer
394
380
        formats = [workingtree_4.WorkingTreeFormat4(),
395
381
                   workingtree_3.WorkingTreeFormat3(),]
396
382
        scenarios = make_scenarios(server1, server2, formats)
397
 
        self.assertEqual(8, len(scenarios))
 
383
        self.assertEqual(7, len(scenarios))
398
384
        default_wt_format = workingtree.format_registry.get_default()
399
385
        wt4_format = workingtree_4.WorkingTreeFormat4()
400
386
        wt5_format = workingtree_4.WorkingTreeFormat5()
401
 
        wt6_format = workingtree_4.WorkingTreeFormat6()
402
387
        expected_scenarios = [
403
388
            ('WorkingTreeFormat4',
404
389
             {'bzrdir_format': formats[0]._matchingbzrdir,
414
399
              'workingtree_format': formats[1],
415
400
              '_workingtree_to_test_tree': return_parameter,
416
401
             }),
417
 
            ('WorkingTreeFormat6,remote',
418
 
             {'bzrdir_format': wt6_format._matchingbzrdir,
419
 
              'repo_is_remote': True,
420
 
              'transport_readonly_server': smart_readonly_server,
421
 
              'transport_server': smart_server,
422
 
              'vfs_transport_factory': mem_server,
423
 
              'workingtree_format': wt6_format,
424
 
              '_workingtree_to_test_tree': return_parameter,
425
 
             }),
426
402
            ('RevisionTree',
427
403
             {'_workingtree_to_test_tree': revision_tree_from_workingtree,
428
404
              'bzrdir_format': default_wt_format._matchingbzrdir,
640
616
        # Guard against regression into MemoryTransport leaking
641
617
        # files to disk instead of keeping them in memory.
642
618
        self.assertFalse(osutils.lexists('dir'))
643
 
        dir_format = controldir.format_registry.make_bzrdir('knit')
 
619
        dir_format = bzrdir.format_registry.make_bzrdir('knit')
644
620
        self.assertEqual(dir_format.repository_format.__class__,
645
621
                         the_branch.repository._format.__class__)
646
622
        self.assertEqual('Bazaar-NG Knit Repository Format 1',
650
626
    def test_dangling_locks_cause_failures(self):
651
627
        class TestDanglingLock(tests.TestCaseWithMemoryTransport):
652
628
            def test_function(self):
653
 
                t = self.get_transport_from_path('.')
 
629
                t = self.get_transport('.')
654
630
                l = lockdir.LockDir(t, 'lock')
655
631
                l.create()
656
632
                l.attempt_lock()
676
652
        # for the server
677
653
        url = self.get_readonly_url()
678
654
        url2 = self.get_readonly_url('foo/bar')
679
 
        t = transport.get_transport_from_url(url)
680
 
        t2 = transport.get_transport_from_url(url2)
 
655
        t = transport.get_transport(url)
 
656
        t2 = transport.get_transport(url2)
681
657
        self.assertIsInstance(t, ReadonlyTransportDecorator)
682
658
        self.assertIsInstance(t2, ReadonlyTransportDecorator)
683
659
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
691
667
        url = self.get_readonly_url()
692
668
        url2 = self.get_readonly_url('foo/bar')
693
669
        # the transport returned may be any HttpTransportBase subclass
694
 
        t = transport.get_transport_from_url(url)
695
 
        t2 = transport.get_transport_from_url(url2)
 
670
        t = transport.get_transport(url)
 
671
        t2 = transport.get_transport(url2)
696
672
        self.assertIsInstance(t, HttpTransportBase)
697
673
        self.assertIsInstance(t2, HttpTransportBase)
698
674
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
709
685
        builder = self.make_branch_builder('dir')
710
686
        rev_id = builder.build_commit()
711
687
        self.assertPathExists('dir')
712
 
        a_dir = controldir.ControlDir.open('dir')
 
688
        a_dir = bzrdir.BzrDir.open('dir')
713
689
        self.assertRaises(errors.NoWorkingTree, a_dir.open_workingtree)
714
690
        a_branch = a_dir.open_branch()
715
691
        builder_branch = builder.get_branch()
736
712
class TestChrootedTest(tests.ChrootedTestCase):
737
713
 
738
714
    def test_root_is_root(self):
739
 
        t = transport.get_transport_from_url(self.get_readonly_url())
 
715
        t = transport.get_transport(self.get_readonly_url())
740
716
        url = t.base
741
717
        self.assertEqual(url, t.clone('..').base)
742
718
 
744
720
class TestProfileResult(tests.TestCase):
745
721
 
746
722
    def test_profiles_tests(self):
747
 
        self.requireFeature(features.lsprof_feature)
748
 
        terminal = testtools.testresult.doubles.ExtendedTestResult()
 
723
        self.requireFeature(test_lsprof.LSProfFeature)
 
724
        terminal = testtools.tests.helpers.ExtendedTestResult()
749
725
        result = tests.ProfileResult(terminal)
750
726
        class Sample(tests.TestCase):
751
727
            def a(self):
768
744
                descriptions=0,
769
745
                verbosity=1,
770
746
                )
771
 
        capture = testtools.testresult.doubles.ExtendedTestResult()
 
747
        capture = testtools.tests.helpers.ExtendedTestResult()
772
748
        test_case.run(MultiTestResult(result, capture))
773
749
        run_case = capture._events[0][1]
774
750
        timed_string = result._testTimeString(run_case)
805
781
 
806
782
    def test_lsprofiling(self):
807
783
        """Verbose test result prints lsprof statistics from test cases."""
808
 
        self.requireFeature(features.lsprof_feature)
 
784
        self.requireFeature(test_lsprof.LSProfFeature)
809
785
        result_stream = StringIO()
810
786
        result = bzrlib.tests.VerboseTestResult(
811
787
            result_stream,
856
832
        self.assertEndsWith(sio.getvalue(), "OK    50002ms\n")
857
833
 
858
834
    def test_known_failure(self):
859
 
        """Using knownFailure should trigger several result actions."""
 
835
        """A KnownFailure being raised should trigger several result actions."""
860
836
        class InstrumentedTestResult(tests.ExtendedTestResult):
861
837
            def stopTestRun(self): pass
862
838
            def report_tests_starting(self): pass
865
841
        result = InstrumentedTestResult(None, None, None, None)
866
842
        class Test(tests.TestCase):
867
843
            def test_function(self):
868
 
                self.knownFailure('failed!')
 
844
                raise tests.KnownFailure('failed!')
869
845
        test = Test("test_function")
870
846
        test.run(result)
871
847
        # it should invoke 'report_known_failure'.
887
863
            descriptions=0,
888
864
            verbosity=2,
889
865
            )
890
 
        _get_test("test_xfail").run(result)
891
 
        self.assertContainsRe(result_stream.getvalue(),
892
 
            "\n\\S+\\.test_xfail\\s+XFAIL\\s+\\d+ms\n"
893
 
            "\\s*(?:Text attachment: )?reason"
894
 
            "(?:\n-+\n|: {{{)"
895
 
            "this_fails"
896
 
            "(?:\n-+\n|}}}\n)")
 
866
        test = self.get_passing_test()
 
867
        result.startTest(test)
 
868
        prefix = len(result_stream.getvalue())
 
869
        # the err parameter has the shape:
 
870
        # (class, exception object, traceback)
 
871
        # KnownFailures dont get their tracebacks shown though, so we
 
872
        # can skip that.
 
873
        err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
 
874
        result.report_known_failure(test, err)
 
875
        output = result_stream.getvalue()[prefix:]
 
876
        lines = output.splitlines()
 
877
        self.assertContainsRe(lines[0], r'XFAIL *\d+ms$')
 
878
        if sys.version_info > (2, 7):
 
879
            self.expectFailure("_ExpectedFailure on 2.7 loses the message",
 
880
                self.assertNotEqual, lines[1], '    ')
 
881
        self.assertEqual(lines[1], '    foo')
 
882
        self.assertEqual(2, len(lines))
897
883
 
898
884
    def get_passing_test(self):
899
885
        """Return a test object that can't be run usefully."""
910
896
                self._call = test, feature
911
897
        result = InstrumentedTestResult(None, None, None, None)
912
898
        test = SampleTestCase('_test_pass')
913
 
        feature = features.Feature()
 
899
        feature = tests.Feature()
914
900
        result.startTest(test)
915
901
        result.addNotSupported(test, feature)
916
902
        # it should invoke 'report_unsupported'.
935
921
            verbosity=2,
936
922
            )
937
923
        test = self.get_passing_test()
938
 
        feature = features.Feature()
 
924
        feature = tests.Feature()
939
925
        result.startTest(test)
940
926
        prefix = len(result_stream.getvalue())
941
927
        result.report_unsupported(test, feature)
954
940
            def addNotSupported(self, test, feature):
955
941
                self._call = test, feature
956
942
        result = InstrumentedTestResult(None, None, None, None)
957
 
        feature = features.Feature()
 
943
        feature = tests.Feature()
958
944
        class Test(tests.TestCase):
959
945
            def test_function(self):
960
946
                raise tests.UnavailableFeature(feature)
979
965
    def test_strict_with_known_failure(self):
980
966
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
981
967
                                             verbosity=1)
982
 
        test = _get_test("test_xfail")
983
 
        test.run(result)
 
968
        test = self.get_passing_test()
 
969
        err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
 
970
        result.addExpectedFailure(test, err)
984
971
        self.assertFalse(result.wasStrictlySuccessful())
985
972
        self.assertEqual(None, result._extractBenchmarkTime(test))
986
973
 
1002
989
            pass
1003
990
        test = unittest.FunctionTestCase(test_function)
1004
991
        test.run(result)
1005
 
        self.assertEqual(1, result.calls)
 
992
        self.assertEquals(1, result.calls)
1006
993
 
1007
994
    def test_startTests_only_once(self):
1008
995
        """With multiple tests startTests should still only be called once"""
1014
1001
            unittest.FunctionTestCase(lambda: None),
1015
1002
            unittest.FunctionTestCase(lambda: None)])
1016
1003
        suite.run(result)
1017
 
        self.assertEqual(1, result.calls)
1018
 
        self.assertEqual(2, result.count)
 
1004
        self.assertEquals(1, result.calls)
 
1005
        self.assertEquals(2, result.count)
 
1006
 
 
1007
 
 
1008
class TestUnicodeFilenameFeature(tests.TestCase):
 
1009
 
 
1010
    def test_probe_passes(self):
 
1011
        """UnicodeFilenameFeature._probe passes."""
 
1012
        # We can't test much more than that because the behaviour depends
 
1013
        # on the platform.
 
1014
        tests.UnicodeFilenameFeature._probe()
1019
1015
 
1020
1016
 
1021
1017
class TestRunner(tests.TestCase):
1049
1045
        test = unittest.TestSuite()
1050
1046
        test.addTest(Test("known_failure_test"))
1051
1047
        def failing_test():
1052
 
            raise AssertionError('foo')
 
1048
            self.fail('foo')
1053
1049
        test.addTest(unittest.FunctionTestCase(failing_test))
1054
1050
        stream = StringIO()
1055
1051
        runner = tests.TextTestRunner(stream=stream)
1063
1059
            '^----------------------------------------------------------------------\n'
1064
1060
            'Traceback \\(most recent call last\\):\n'
1065
1061
            '  .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1066
 
            '    raise AssertionError\\(\'foo\'\\)\n'
 
1062
            '    self.fail\\(\'foo\'\\)\n'
1067
1063
            '.*'
1068
1064
            '^----------------------------------------------------------------------\n'
1069
1065
            '.*'
1075
1071
        # the final output.
1076
1072
        class Test(tests.TestCase):
1077
1073
            def known_failure_test(self):
1078
 
                self.knownFailure("Never works...")
 
1074
                self.expectFailure('failed', self.assertTrue, False)
1079
1075
        test = Test("known_failure_test")
1080
1076
        stream = StringIO()
1081
1077
        runner = tests.TextTestRunner(stream=stream)
1087
1083
            '\n'
1088
1084
            'OK \\(known_failures=1\\)\n')
1089
1085
 
1090
 
    def test_unexpected_success_bad(self):
1091
 
        class Test(tests.TestCase):
1092
 
            def test_truth(self):
1093
 
                self.expectFailure("No absolute truth", self.assertTrue, True)
1094
 
        runner = tests.TextTestRunner(stream=StringIO())
1095
 
        result = self.run_test_runner(runner, Test("test_truth"))
1096
 
        self.assertContainsRe(runner.stream.getvalue(),
1097
 
            "=+\n"
1098
 
            "FAIL: \\S+\.test_truth\n"
1099
 
            "-+\n"
1100
 
            "(?:.*\n)*"
1101
 
            "\\s*(?:Text attachment: )?reason"
1102
 
            "(?:\n-+\n|: {{{)"
1103
 
            "No absolute truth"
1104
 
            "(?:\n-+\n|}}}\n)"
1105
 
            "(?:.*\n)*"
1106
 
            "-+\n"
1107
 
            "Ran 1 test in .*\n"
1108
 
            "\n"
1109
 
            "FAILED \\(failures=1\\)\n\\Z")
1110
 
 
1111
1086
    def test_result_decorator(self):
1112
1087
        # decorate results
1113
1088
        calls = []
1161
1136
        class SkippedTest(tests.TestCase):
1162
1137
 
1163
1138
            def setUp(self):
1164
 
                super(SkippedTest, self).setUp()
 
1139
                tests.TestCase.setUp(self)
1165
1140
                calls.append('setUp')
1166
1141
                self.addCleanup(self.cleanup)
1167
1142
 
1197
1172
 
1198
1173
    def test_unsupported_features_listed(self):
1199
1174
        """When unsupported features are encountered they are detailed."""
1200
 
        class Feature1(features.Feature):
 
1175
        class Feature1(tests.Feature):
1201
1176
            def _probe(self): return False
1202
 
        class Feature2(features.Feature):
 
1177
        class Feature2(tests.Feature):
1203
1178
            def _probe(self): return False
1204
1179
        # create sample tests
1205
1180
        test1 = SampleTestCase('_test_pass')
1272
1247
        result = self.run_test_runner(tests.TextTestRunner(stream=out),
1273
1248
            FailureWithUnicode("test_log_unicode"))
1274
1249
        self.assertContainsRe(out.getvalue(),
1275
 
            "(?:Text attachment: )?log"
1276
 
            "(?:\n-+\n|: {{{)"
1277
 
            "\d+\.\d+  \\\\u2606"
1278
 
            "(?:\n-+\n|}}}\n)")
 
1250
            "Text attachment: log\n"
 
1251
            "-+\n"
 
1252
            "\d+\.\d+  \\\\u2606\n"
 
1253
            "-+\n")
1279
1254
 
1280
1255
 
1281
1256
class SampleTestCase(tests.TestCase):
1482
1457
 
1483
1458
        Each self.time() call is individually and separately profiled.
1484
1459
        """
1485
 
        self.requireFeature(features.lsprof_feature)
 
1460
        self.requireFeature(test_lsprof.LSProfFeature)
1486
1461
        # overrides the class member with an instance member so no cleanup
1487
1462
        # needed.
1488
1463
        self._gather_lsprof_in_benchmarks = True
1507
1482
        transport_server = memory.MemoryServer()
1508
1483
        transport_server.start_server()
1509
1484
        self.addCleanup(transport_server.stop_server)
1510
 
        t = transport.get_transport_from_url(transport_server.get_url())
1511
 
        controldir.ControlDir.create(t.base)
 
1485
        t = transport.get_transport(transport_server.get_url())
 
1486
        bzrdir.BzrDir.create(t.base)
1512
1487
        self.assertRaises(errors.BzrError,
1513
 
            controldir.ControlDir.open_from_transport, t)
 
1488
            bzrdir.BzrDir.open_from_transport, t)
1514
1489
        # But if we declare this as safe, we can open the bzrdir.
1515
1490
        self.permit_url(t.base)
1516
1491
        self._bzr_selftest_roots.append(t.base)
1517
 
        controldir.ControlDir.open_from_transport(t)
 
1492
        bzrdir.BzrDir.open_from_transport(t)
1518
1493
 
1519
1494
    def test_requireFeature_available(self):
1520
1495
        """self.requireFeature(available) is a no-op."""
1521
 
        class Available(features.Feature):
 
1496
        class Available(tests.Feature):
1522
1497
            def _probe(self):return True
1523
1498
        feature = Available()
1524
1499
        self.requireFeature(feature)
1525
1500
 
1526
1501
    def test_requireFeature_unavailable(self):
1527
1502
        """self.requireFeature(unavailable) raises UnavailableFeature."""
1528
 
        class Unavailable(features.Feature):
 
1503
        class Unavailable(tests.Feature):
1529
1504
            def _probe(self):return False
1530
1505
        feature = Unavailable()
1531
1506
        self.assertRaises(tests.UnavailableFeature,
1654
1629
        self.assertRaises(AssertionError,
1655
1630
            self.assertListRaises, _TestException, success_generator)
1656
1631
 
1657
 
    def _run_successful_test(self, test):
1658
 
        result = testtools.TestResult()
1659
 
        test.run(result)
1660
 
        self.assertTrue(result.wasSuccessful())
1661
 
        return result
1662
 
 
1663
1632
    def test_overrideAttr_without_value(self):
1664
1633
        self.test_attr = 'original' # Define a test attribute
1665
1634
        obj = self # Make 'obj' visible to the embedded test
1666
1635
        class Test(tests.TestCase):
1667
1636
 
1668
1637
            def setUp(self):
1669
 
                super(Test, self).setUp()
 
1638
                tests.TestCase.setUp(self)
1670
1639
                self.orig = self.overrideAttr(obj, 'test_attr')
1671
1640
 
1672
1641
            def test_value(self):
1675
1644
                obj.test_attr = 'modified'
1676
1645
                self.assertEqual('modified', obj.test_attr)
1677
1646
 
1678
 
        self._run_successful_test(Test('test_value'))
 
1647
        test = Test('test_value')
 
1648
        test.run(unittest.TestResult())
1679
1649
        self.assertEqual('original', obj.test_attr)
1680
1650
 
1681
1651
    def test_overrideAttr_with_value(self):
1684
1654
        class Test(tests.TestCase):
1685
1655
 
1686
1656
            def setUp(self):
1687
 
                super(Test, self).setUp()
 
1657
                tests.TestCase.setUp(self)
1688
1658
                self.orig = self.overrideAttr(obj, 'test_attr', new='modified')
1689
1659
 
1690
1660
            def test_value(self):
1691
1661
                self.assertEqual('original', self.orig)
1692
1662
                self.assertEqual('modified', obj.test_attr)
1693
1663
 
1694
 
        self._run_successful_test(Test('test_value'))
 
1664
        test = Test('test_value')
 
1665
        test.run(unittest.TestResult())
1695
1666
        self.assertEqual('original', obj.test_attr)
1696
1667
 
1697
 
    def test_overrideAttr_with_no_existing_value_and_value(self):
1698
 
        # Do not define the test_attribute
1699
 
        obj = self # Make 'obj' visible to the embedded test
1700
 
        class Test(tests.TestCase):
1701
 
 
1702
 
            def setUp(self):
1703
 
                tests.TestCase.setUp(self)
1704
 
                self.orig = self.overrideAttr(obj, 'test_attr', new='modified')
1705
 
 
1706
 
            def test_value(self):
1707
 
                self.assertEqual(tests._unitialized_attr, self.orig)
1708
 
                self.assertEqual('modified', obj.test_attr)
1709
 
 
1710
 
        self._run_successful_test(Test('test_value'))
1711
 
        self.assertRaises(AttributeError, getattr, obj, 'test_attr')
1712
 
 
1713
 
    def test_overrideAttr_with_no_existing_value_and_no_value(self):
1714
 
        # Do not define the test_attribute
1715
 
        obj = self # Make 'obj' visible to the embedded test
1716
 
        class Test(tests.TestCase):
1717
 
 
1718
 
            def setUp(self):
1719
 
                tests.TestCase.setUp(self)
1720
 
                self.orig = self.overrideAttr(obj, 'test_attr')
1721
 
 
1722
 
            def test_value(self):
1723
 
                self.assertEqual(tests._unitialized_attr, self.orig)
1724
 
                self.assertRaises(AttributeError, getattr, obj, 'test_attr')
1725
 
 
1726
 
        self._run_successful_test(Test('test_value'))
1727
 
        self.assertRaises(AttributeError, getattr, obj, 'test_attr')
1728
 
 
1729
 
    def test_recordCalls(self):
1730
 
        from bzrlib.tests import test_selftest
1731
 
        calls = self.recordCalls(
1732
 
            test_selftest, '_add_numbers')
1733
 
        self.assertEqual(test_selftest._add_numbers(2, 10),
1734
 
            12)
1735
 
        self.assertEqual(calls, [((2, 10), {})])
1736
 
 
1737
 
 
1738
 
def _add_numbers(a, b):
1739
 
    return a + b
1740
 
 
1741
 
 
1742
 
class _MissingFeature(features.Feature):
 
1668
 
 
1669
class _MissingFeature(tests.Feature):
1743
1670
    def _probe(self):
1744
1671
        return False
1745
1672
missing_feature = _MissingFeature()
1796
1723
        result = self._run_test('test_fail')
1797
1724
        self.assertEqual(1, len(result.failures))
1798
1725
        result_content = result.failures[0][1]
1799
 
        self.assertContainsRe(result_content,
1800
 
            '(?m)^(?:Text attachment: )?log(?:$|: )')
 
1726
        self.assertContainsRe(result_content, 'Text attachment: log')
1801
1727
        self.assertContainsRe(result_content, 'this was a failing test')
1802
1728
 
1803
1729
    def test_error_has_log(self):
1804
1730
        result = self._run_test('test_error')
1805
1731
        self.assertEqual(1, len(result.errors))
1806
1732
        result_content = result.errors[0][1]
1807
 
        self.assertContainsRe(result_content,
1808
 
            '(?m)^(?:Text attachment: )?log(?:$|: )')
 
1733
        self.assertContainsRe(result_content, 'Text attachment: log')
1809
1734
        self.assertContainsRe(result_content, 'this test errored')
1810
1735
 
1811
1736
    def test_skip_has_no_log(self):
1830
1755
        result = self._run_test('test_xfail')
1831
1756
        self.assertEqual(1, len(result.expectedFailures))
1832
1757
        result_content = result.expectedFailures[0][1]
1833
 
        self.assertNotContainsRe(result_content,
1834
 
            '(?m)^(?:Text attachment: )?log(?:$|: )')
 
1758
        self.assertNotContainsRe(result_content, 'Text attachment: log')
1835
1759
        self.assertNotContainsRe(result_content, 'test with expected failure')
1836
1760
 
1837
1761
    def test_unexpected_success_has_log(self):
1912
1836
        self.assertIsInstance(2, int)
1913
1837
        self.assertIsInstance(u'', basestring)
1914
1838
        e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1915
 
        self.assertEqual(str(e),
 
1839
        self.assertEquals(str(e),
1916
1840
            "None is an instance of <type 'NoneType'> rather than <type 'int'>")
1917
1841
        self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1918
1842
        e = self.assertRaises(AssertionError,
1919
1843
            self.assertIsInstance, None, int, "it's just not")
1920
 
        self.assertEqual(str(e),
 
1844
        self.assertEquals(str(e),
1921
1845
            "None is an instance of <type 'NoneType'> rather than <type 'int'>"
1922
1846
            ": it's just not")
1923
1847
 
1928
1852
    def test_assertEqualDiff(self):
1929
1853
        e = self.assertRaises(AssertionError,
1930
1854
                              self.assertEqualDiff, '', '\n')
1931
 
        self.assertEqual(str(e),
 
1855
        self.assertEquals(str(e),
1932
1856
                          # Don't blink ! The '+' applies to the second string
1933
1857
                          'first string is missing a final newline.\n+ \n')
1934
1858
        e = self.assertRaises(AssertionError,
1935
1859
                              self.assertEqualDiff, '\n', '')
1936
 
        self.assertEqual(str(e),
 
1860
        self.assertEquals(str(e),
1937
1861
                          # Don't blink ! The '-' applies to the second string
1938
1862
                          'second string is missing a final newline.\n- \n')
1939
1863
 
1996
1920
            warnings.warn("this is your last warning")
1997
1921
            return a + b
1998
1922
        wlist, result = self.callCatchWarnings(meth, 1, 2)
1999
 
        self.assertEqual(3, result)
 
1923
        self.assertEquals(3, result)
2000
1924
        # would like just to compare them, but UserWarning doesn't implement
2001
1925
        # eq well
2002
1926
        w0, = wlist
2003
1927
        self.assertIsInstance(w0, UserWarning)
2004
 
        self.assertEqual("this is your last warning", str(w0))
 
1928
        self.assertEquals("this is your last warning", str(w0))
2005
1929
 
2006
1930
 
2007
1931
class TestConvenienceMakers(tests.TestCaseWithTransport):
2010
1934
    def test_make_branch_and_tree_with_format(self):
2011
1935
        # we should be able to supply a format to make_branch_and_tree
2012
1936
        self.make_branch_and_tree('a', format=bzrlib.bzrdir.BzrDirMetaFormat1())
2013
 
        self.assertIsInstance(bzrlib.controldir.ControlDir.open('a')._format,
 
1937
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('a')._format,
2014
1938
                              bzrlib.bzrdir.BzrDirMetaFormat1)
2015
1939
 
2016
1940
    def test_make_branch_and_memory_tree(self):
2028
1952
        tree = self.make_branch_and_tree('t1')
2029
1953
        base = tree.bzrdir.root_transport.base
2030
1954
        self.assertStartsWith(base, 'file://')
2031
 
        self.assertEqual(tree.bzrdir.root_transport,
 
1955
        self.assertEquals(tree.bzrdir.root_transport,
2032
1956
                tree.branch.bzrdir.root_transport)
2033
 
        self.assertEqual(tree.bzrdir.root_transport,
 
1957
        self.assertEquals(tree.bzrdir.root_transport,
2034
1958
                tree.branch.repository.bzrdir.root_transport)
2035
1959
 
2036
1960
 
2094
2018
        self.assertLength(2, output.readlines())
2095
2019
 
2096
2020
    def test_lsprof_tests(self):
2097
 
        self.requireFeature(features.lsprof_feature)
2098
 
        results = []
 
2021
        self.requireFeature(test_lsprof.LSProfFeature)
 
2022
        calls = []
2099
2023
        class Test(object):
2100
2024
            def __call__(test, result):
2101
2025
                test.run(result)
2102
2026
            def run(test, result):
2103
 
                results.append(result)
 
2027
                self.assertIsInstance(result, ExtendedToOriginalDecorator)
 
2028
                calls.append("called")
2104
2029
            def countTestCases(self):
2105
2030
                return 1
2106
2031
        self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
2107
 
        self.assertLength(1, results)
2108
 
        self.assertIsInstance(results.pop(), ExtendedToOriginalDecorator)
 
2032
        self.assertLength(1, calls)
2109
2033
 
2110
2034
    def test_random(self):
2111
2035
        # test randomising by listing a number of tests.
2246
2170
        self.assertNotContainsRe(content, 'test with expected failure')
2247
2171
        self.assertEqual(1, len(result.expectedFailures))
2248
2172
        result_content = result.expectedFailures[0][1]
2249
 
        self.assertNotContainsRe(result_content,
2250
 
            '(?m)^(?:Text attachment: )?log(?:$|: )')
 
2173
        self.assertNotContainsRe(result_content, 'Text attachment: log')
2251
2174
        self.assertNotContainsRe(result_content, 'test with expected failure')
2252
2175
 
2253
2176
    def test_unexpected_success_has_log(self):
2254
2177
        content, result = self.run_subunit_stream('test_unexpected_success')
2255
2178
        self.assertContainsRe(content, '(?m)^log$')
2256
2179
        self.assertContainsRe(content, 'test with unexpected success')
2257
 
        # GZ 2011-05-18: Old versions of subunit treat unexpected success as a
2258
 
        #                success, if a min version check is added remove this
2259
 
        from subunit import TestProtocolClient as _Client
2260
 
        if _Client.addUnexpectedSuccess.im_func is _Client.addSuccess.im_func:
2261
 
            self.expectFailure('subunit treats "unexpectedSuccess"'
2262
 
                               ' as a plain success',
2263
 
                self.assertEqual, 1, len(result.unexpectedSuccesses))
 
2180
        self.expectFailure('subunit treats "unexpectedSuccess"'
 
2181
                           ' as a plain success',
 
2182
            self.assertEqual, 1, len(result.unexpectedSuccesses))
2264
2183
        self.assertEqual(1, len(result.unexpectedSuccesses))
2265
2184
        test = result.unexpectedSuccesses[0]
2266
2185
        # RemotedTestCase doesn't preserve the "details"
2300
2219
        self.assertEqual(['rocks'], self.argv)
2301
2220
        self.assertEqual(34, self.retcode)
2302
2221
        self.assertEqual('It sure does!\n', out)
2303
 
        self.assertEqual(out, self.out)
 
2222
        self.assertEquals(out, self.out)
2304
2223
        self.assertEqual('', err)
2305
 
        self.assertEqual(err, self.err)
 
2224
        self.assertEquals(err, self.err)
2306
2225
 
2307
2226
    def test_run_bzr_error_regexes(self):
2308
2227
        self.out = ''
2448
2367
    """Base class for tests testing how we might run bzr."""
2449
2368
 
2450
2369
    def setUp(self):
2451
 
        super(TestWithFakedStartBzrSubprocess, self).setUp()
 
2370
        tests.TestCaseWithTransport.setUp(self)
2452
2371
        self.subprocess_calls = []
2453
2372
 
2454
2373
    def start_bzr_subprocess(self, process_args, env_changes=None,
2564
2483
 
2565
2484
 
2566
2485
class TestStartBzrSubProcess(tests.TestCase):
2567
 
    """Stub test start_bzr_subprocess."""
2568
2486
 
2569
 
    def _subprocess_log_cleanup(self):
2570
 
        """Inhibits the base version as we don't produce a log file."""
 
2487
    def check_popen_state(self):
 
2488
        """Replace to make assertions when popen is called."""
2571
2489
 
2572
2490
    def _popen(self, *args, **kwargs):
2573
 
        """Override the base version to record the command that is run.
2574
 
 
2575
 
        From there we can ensure it is correct without spawning a real process.
2576
 
        """
 
2491
        """Record the command that is run, so that we can ensure it is correct"""
2577
2492
        self.check_popen_state()
2578
2493
        self._popen_args = args
2579
2494
        self._popen_kwargs = kwargs
2580
2495
        raise _DontSpawnProcess()
2581
2496
 
2582
 
    def check_popen_state(self):
2583
 
        """Replace to make assertions when popen is called."""
2584
 
 
2585
2497
    def test_run_bzr_subprocess_no_plugins(self):
2586
2498
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [])
2587
2499
        command = self._popen_args[0]
2591
2503
 
2592
2504
    def test_allow_plugins(self):
2593
2505
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2594
 
                          allow_plugins=True)
 
2506
            allow_plugins=True)
2595
2507
        command = self._popen_args[0]
2596
2508
        self.assertEqual([], command[2:])
2597
2509
 
2602
2514
            self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2603
2515
        self.check_popen_state = check_environment
2604
2516
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2605
 
                          env_changes={'EXISTANT_ENV_VAR':'set variable'})
 
2517
            env_changes={'EXISTANT_ENV_VAR':'set variable'})
2606
2518
        # not set in theparent
2607
2519
        self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2608
2520
 
2614
2526
        os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2615
2527
        self.check_popen_state = check_environment
2616
2528
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2617
 
                          env_changes={'EXISTANT_ENV_VAR':None})
 
2529
            env_changes={'EXISTANT_ENV_VAR':None})
2618
2530
        # Still set in parent
2619
2531
        self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2620
2532
        del os.environ['EXISTANT_ENV_VAR']
2625
2537
            self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2626
2538
        self.check_popen_state = check_environment
2627
2539
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2628
 
                          env_changes={'NON_EXISTANT_ENV_VAR':None})
 
2540
            env_changes={'NON_EXISTANT_ENV_VAR':None})
2629
2541
 
2630
2542
    def test_working_dir(self):
2631
2543
        """Test that we can specify the working dir for the child"""
2634
2546
        chdirs = []
2635
2547
        def chdir(path):
2636
2548
            chdirs.append(path)
2637
 
        self.overrideAttr(os, 'chdir', chdir)
2638
 
        def getcwd():
2639
 
            return 'current'
2640
 
        self.overrideAttr(osutils, 'getcwd', getcwd)
2641
 
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2642
 
                          working_dir='foo')
 
2549
        os.chdir = chdir
 
2550
        try:
 
2551
            def getcwd():
 
2552
                return 'current'
 
2553
            osutils.getcwd = getcwd
 
2554
            try:
 
2555
                self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
 
2556
                    working_dir='foo')
 
2557
            finally:
 
2558
                osutils.getcwd = orig_getcwd
 
2559
        finally:
 
2560
            os.chdir = orig_chdir
2643
2561
        self.assertEqual(['foo', 'current'], chdirs)
2644
2562
 
2645
2563
    def test_get_bzr_path_with_cwd_bzrlib(self):
2665
2583
        self.assertEqual('bzr: interrupted\n', result[1])
2666
2584
 
2667
2585
 
 
2586
class TestFeature(tests.TestCase):
 
2587
 
 
2588
    def test_caching(self):
 
2589
        """Feature._probe is called by the feature at most once."""
 
2590
        class InstrumentedFeature(tests.Feature):
 
2591
            def __init__(self):
 
2592
                super(InstrumentedFeature, self).__init__()
 
2593
                self.calls = []
 
2594
            def _probe(self):
 
2595
                self.calls.append('_probe')
 
2596
                return False
 
2597
        feature = InstrumentedFeature()
 
2598
        feature.available()
 
2599
        self.assertEqual(['_probe'], feature.calls)
 
2600
        feature.available()
 
2601
        self.assertEqual(['_probe'], feature.calls)
 
2602
 
 
2603
    def test_named_str(self):
 
2604
        """Feature.__str__ should thunk to feature_name()."""
 
2605
        class NamedFeature(tests.Feature):
 
2606
            def feature_name(self):
 
2607
                return 'symlinks'
 
2608
        feature = NamedFeature()
 
2609
        self.assertEqual('symlinks', str(feature))
 
2610
 
 
2611
    def test_default_str(self):
 
2612
        """Feature.__str__ should default to __class__.__name__."""
 
2613
        class NamedFeature(tests.Feature):
 
2614
            pass
 
2615
        feature = NamedFeature()
 
2616
        self.assertEqual('NamedFeature', str(feature))
 
2617
 
 
2618
 
 
2619
class TestUnavailableFeature(tests.TestCase):
 
2620
 
 
2621
    def test_access_feature(self):
 
2622
        feature = tests.Feature()
 
2623
        exception = tests.UnavailableFeature(feature)
 
2624
        self.assertIs(feature, exception.args[0])
 
2625
 
 
2626
 
 
2627
simple_thunk_feature = tests._CompatabilityThunkFeature(
 
2628
    deprecated_in((2, 1, 0)),
 
2629
    'bzrlib.tests.test_selftest',
 
2630
    'simple_thunk_feature','UnicodeFilename',
 
2631
    replacement_module='bzrlib.tests'
 
2632
    )
 
2633
 
 
2634
class Test_CompatibilityFeature(tests.TestCase):
 
2635
 
 
2636
    def test_does_thunk(self):
 
2637
        res = self.callDeprecated(
 
2638
            ['bzrlib.tests.test_selftest.simple_thunk_feature was deprecated'
 
2639
             ' in version 2.1.0. Use bzrlib.tests.UnicodeFilename instead.'],
 
2640
            simple_thunk_feature.available)
 
2641
        self.assertEqual(tests.UnicodeFilename.available(), res)
 
2642
 
 
2643
 
 
2644
class TestModuleAvailableFeature(tests.TestCase):
 
2645
 
 
2646
    def test_available_module(self):
 
2647
        feature = tests.ModuleAvailableFeature('bzrlib.tests')
 
2648
        self.assertEqual('bzrlib.tests', feature.module_name)
 
2649
        self.assertEqual('bzrlib.tests', str(feature))
 
2650
        self.assertTrue(feature.available())
 
2651
        self.assertIs(tests, feature.module)
 
2652
 
 
2653
    def test_unavailable_module(self):
 
2654
        feature = tests.ModuleAvailableFeature('bzrlib.no_such_module_exists')
 
2655
        self.assertEqual('bzrlib.no_such_module_exists', str(feature))
 
2656
        self.assertFalse(feature.available())
 
2657
        self.assertIs(None, feature.module)
 
2658
 
 
2659
 
2668
2660
class TestSelftestFiltering(tests.TestCase):
2669
2661
 
2670
2662
    def setUp(self):
2671
 
        super(TestSelftestFiltering, self).setUp()
 
2663
        tests.TestCase.setUp(self)
2672
2664
        self.suite = TestUtil.TestSuite()
2673
2665
        self.loader = TestUtil.TestLoader()
2674
2666
        self.suite.addTest(self.loader.loadTestsFromModule(
2847
2839
            self.run_bzr, ['assert-fail'])
2848
2840
        # make sure we got the real thing, not an error from somewhere else in
2849
2841
        # the test framework
2850
 
        self.assertEqual('always fails', str(e))
 
2842
        self.assertEquals('always fails', str(e))
2851
2843
        # check that there's no traceback in the test log
2852
2844
        self.assertNotContainsRe(self.get_log(), r'Traceback')
2853
2845
 
2902
2894
    def test_load_tests_from_module_name_smoke_test(self):
2903
2895
        loader = TestUtil.TestLoader()
2904
2896
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2905
 
        self.assertEqual(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
 
2897
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
2906
2898
                          _test_ids(suite))
2907
2899
 
2908
2900
    def test_load_tests_from_module_name_with_bogus_module_name(self):
2937
2929
 
2938
2930
    def test_empty_list(self):
2939
2931
        id_list = self._create_id_list([])
2940
 
        self.assertEqual({}, id_list.tests)
2941
 
        self.assertEqual({}, id_list.modules)
 
2932
        self.assertEquals({}, id_list.tests)
 
2933
        self.assertEquals({}, id_list.modules)
2942
2934
 
2943
2935
    def test_valid_list(self):
2944
2936
        id_list = self._create_id_list(
2971
2963
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',
2972
2964
                     'bogus']
2973
2965
        not_found, duplicates = tests.suite_matches_id_list(suite, test_list)
2974
 
        self.assertEqual(['bogus'], not_found)
2975
 
        self.assertEqual([], duplicates)
 
2966
        self.assertEquals(['bogus'], not_found)
 
2967
        self.assertEquals([], duplicates)
2976
2968
 
2977
2969
    def test_suite_matches_id_list_with_duplicates(self):
2978
2970
        loader = TestUtil.TestLoader()
2985
2977
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',]
2986
2978
        not_found, duplicates = tests.suite_matches_id_list(
2987
2979
            dupes, test_list)
2988
 
        self.assertEqual([], not_found)
2989
 
        self.assertEqual(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
 
2980
        self.assertEquals([], not_found)
 
2981
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
2990
2982
                          duplicates)
2991
2983
 
2992
2984
 
3065
3057
        suite = tests.test_suite(test_list,
3066
3058
                                 ['bzrlib.tests.test_selftest.TestTestSuite'])
3067
3059
        # test_test_suite_list_and_start is not included 
3068
 
        self.assertEqual(test_list, _test_ids(suite))
 
3060
        self.assertEquals(test_list, _test_ids(suite))
3069
3061
 
3070
3062
 
3071
3063
class TestLoadTestIdList(tests.TestCaseInTempDir):
3084
3076
        self._create_test_list_file(test_list_fname,
3085
3077
                                    'mod1.cl1.meth1\nmod2.cl2.meth2\n')
3086
3078
        tlist = tests.load_test_id_list(test_list_fname)
3087
 
        self.assertEqual(2, len(tlist))
3088
 
        self.assertEqual('mod1.cl1.meth1', tlist[0])
3089
 
        self.assertEqual('mod2.cl2.meth2', tlist[1])
 
3079
        self.assertEquals(2, len(tlist))
 
3080
        self.assertEquals('mod1.cl1.meth1', tlist[0])
 
3081
        self.assertEquals('mod2.cl2.meth2', tlist[1])
3090
3082
 
3091
3083
    def test_load_dirty_file(self):
3092
3084
        test_list_fname = 'test.list'
3094
3086
                                    '  mod1.cl1.meth1\n\nmod2.cl2.meth2  \n'
3095
3087
                                    'bar baz\n')
3096
3088
        tlist = tests.load_test_id_list(test_list_fname)
3097
 
        self.assertEqual(4, len(tlist))
3098
 
        self.assertEqual('mod1.cl1.meth1', tlist[0])
3099
 
        self.assertEqual('', tlist[1])
3100
 
        self.assertEqual('mod2.cl2.meth2', tlist[2])
3101
 
        self.assertEqual('bar baz', tlist[3])
 
3089
        self.assertEquals(4, len(tlist))
 
3090
        self.assertEquals('mod1.cl1.meth1', tlist[0])
 
3091
        self.assertEquals('', tlist[1])
 
3092
        self.assertEquals('mod2.cl2.meth2', tlist[2])
 
3093
        self.assertEquals('bar baz', tlist[3])
3102
3094
 
3103
3095
 
3104
3096
class TestFilteredByModuleTestLoader(tests.TestCase):
3112
3104
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
3113
3105
        loader = self._create_loader(test_list)
3114
3106
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3115
 
        self.assertEqual(test_list, _test_ids(suite))
 
3107
        self.assertEquals(test_list, _test_ids(suite))
3116
3108
 
3117
3109
    def test_exclude_tests(self):
3118
3110
        test_list = ['bogus']
3119
3111
        loader = self._create_loader(test_list)
3120
3112
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3121
 
        self.assertEqual([], _test_ids(suite))
 
3113
        self.assertEquals([], _test_ids(suite))
3122
3114
 
3123
3115
 
3124
3116
class TestFilteredByNameStartTestLoader(tests.TestCase):
3134
3126
        loader = self._create_loader('bzrlib.tests.test_samp')
3135
3127
 
3136
3128
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3137
 
        self.assertEqual(test_list, _test_ids(suite))
 
3129
        self.assertEquals(test_list, _test_ids(suite))
3138
3130
 
3139
3131
    def test_load_tests_inside_module(self):
3140
3132
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
3141
3133
        loader = self._create_loader('bzrlib.tests.test_sampler.Demo')
3142
3134
 
3143
3135
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3144
 
        self.assertEqual(test_list, _test_ids(suite))
 
3136
        self.assertEquals(test_list, _test_ids(suite))
3145
3137
 
3146
3138
    def test_exclude_tests(self):
3147
3139
        test_list = ['bogus']
3148
3140
        loader = self._create_loader('bogus')
3149
3141
 
3150
3142
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3151
 
        self.assertEqual([], _test_ids(suite))
 
3143
        self.assertEquals([], _test_ids(suite))
3152
3144
 
3153
3145
 
3154
3146
class TestTestPrefixRegistry(tests.TestCase):
3160
3152
    def test_register_new_prefix(self):
3161
3153
        tpr = self._get_registry()
3162
3154
        tpr.register('foo', 'fff.ooo.ooo')
3163
 
        self.assertEqual('fff.ooo.ooo', tpr.get('foo'))
 
3155
        self.assertEquals('fff.ooo.ooo', tpr.get('foo'))
3164
3156
 
3165
3157
    def test_register_existing_prefix(self):
3166
3158
        tpr = self._get_registry()
3167
3159
        tpr.register('bar', 'bbb.aaa.rrr')
3168
3160
        tpr.register('bar', 'bBB.aAA.rRR')
3169
 
        self.assertEqual('bbb.aaa.rrr', tpr.get('bar'))
 
3161
        self.assertEquals('bbb.aaa.rrr', tpr.get('bar'))
3170
3162
        self.assertThat(self.get_log(),
3171
3163
            DocTestMatches("...bar...bbb.aaa.rrr...BB.aAA.rRR",
3172
3164
                           doctest.ELLIPSIS))
3178
3170
    def test_resolve_prefix(self):
3179
3171
        tpr = self._get_registry()
3180
3172
        tpr.register('bar', 'bb.aa.rr')
3181
 
        self.assertEqual('bb.aa.rr', tpr.resolve_alias('bar'))
 
3173
        self.assertEquals('bb.aa.rr', tpr.resolve_alias('bar'))
3182
3174
 
3183
3175
    def test_resolve_unknown_alias(self):
3184
3176
        tpr = self._get_registry()
3187
3179
 
3188
3180
    def test_predefined_prefixes(self):
3189
3181
        tpr = tests.test_prefix_alias_registry
3190
 
        self.assertEqual('bzrlib', tpr.resolve_alias('bzrlib'))
3191
 
        self.assertEqual('bzrlib.doc', tpr.resolve_alias('bd'))
3192
 
        self.assertEqual('bzrlib.utils', tpr.resolve_alias('bu'))
3193
 
        self.assertEqual('bzrlib.tests', tpr.resolve_alias('bt'))
3194
 
        self.assertEqual('bzrlib.tests.blackbox', tpr.resolve_alias('bb'))
3195
 
        self.assertEqual('bzrlib.plugins', tpr.resolve_alias('bp'))
 
3182
        self.assertEquals('bzrlib', tpr.resolve_alias('bzrlib'))
 
3183
        self.assertEquals('bzrlib.doc', tpr.resolve_alias('bd'))
 
3184
        self.assertEquals('bzrlib.utils', tpr.resolve_alias('bu'))
 
3185
        self.assertEquals('bzrlib.tests', tpr.resolve_alias('bt'))
 
3186
        self.assertEquals('bzrlib.tests.blackbox', tpr.resolve_alias('bb'))
 
3187
        self.assertEquals('bzrlib.plugins', tpr.resolve_alias('bp'))
3196
3188
 
3197
3189
 
3198
3190
class TestThreadLeakDetection(tests.TestCase):
3369
3361
        self.assertLength(1, calls)
3370
3362
 
3371
3363
 
3372
 
class _Selftest(object):
3373
 
    """Mixin for tests needing full selftest output"""
3374
 
 
3375
 
    def _inject_stream_into_subunit(self, stream):
3376
 
        """To be overridden by subclasses that run tests out of process"""
3377
 
 
3378
 
    def _run_selftest(self, **kwargs):
3379
 
        sio = StringIO()
3380
 
        self._inject_stream_into_subunit(sio)
3381
 
        tests.selftest(stream=sio, stop_on_failure=False, **kwargs)
3382
 
        return sio.getvalue()
3383
 
 
3384
 
 
3385
 
class _ForkedSelftest(_Selftest):
3386
 
    """Mixin for tests needing full selftest output with forked children"""
3387
 
 
3388
 
    _test_needs_features = [features.subunit]
3389
 
 
3390
 
    def _inject_stream_into_subunit(self, stream):
3391
 
        """Monkey-patch subunit so the extra output goes to stream not stdout
3392
 
 
3393
 
        Some APIs need rewriting so this kind of bogus hackery can be replaced
3394
 
        by passing the stream param from run_tests down into ProtocolTestCase.
3395
 
        """
3396
 
        from subunit import ProtocolTestCase
3397
 
        _original_init = ProtocolTestCase.__init__
3398
 
        def _init_with_passthrough(self, *args, **kwargs):
3399
 
            _original_init(self, *args, **kwargs)
3400
 
            self._passthrough = stream
3401
 
        self.overrideAttr(ProtocolTestCase, "__init__", _init_with_passthrough)
3402
 
 
3403
 
    def _run_selftest(self, **kwargs):
3404
 
        # GZ 2011-05-26: Add a PosixSystem feature so this check can go away
3405
 
        if getattr(os, "fork", None) is None:
3406
 
            raise tests.TestNotApplicable("Platform doesn't support forking")
3407
 
        # Make sure the fork code is actually invoked by claiming two cores
3408
 
        self.overrideAttr(osutils, "local_concurrency", lambda: 2)
3409
 
        kwargs.setdefault("suite_decorators", []).append(tests.fork_decorator)
3410
 
        return super(_ForkedSelftest, self)._run_selftest(**kwargs)
3411
 
 
3412
 
 
3413
 
class TestParallelFork(_ForkedSelftest, tests.TestCase):
3414
 
    """Check operation of --parallel=fork selftest option"""
3415
 
 
3416
 
    def test_error_in_child_during_fork(self):
3417
 
        """Error in a forked child during test setup should get reported"""
3418
 
        class Test(tests.TestCase):
3419
 
            def testMethod(self):
3420
 
                pass
3421
 
        # We don't care what, just break something that a child will run
3422
 
        self.overrideAttr(tests, "workaround_zealous_crypto_random", None)
3423
 
        out = self._run_selftest(test_suite_factory=Test)
3424
 
        # Lines from the tracebacks of the two child processes may be mixed
3425
 
        # together due to the way subunit parses and forwards the streams,
3426
 
        # so permit extra lines between each part of the error output.
3427
 
        self.assertContainsRe(out,
3428
 
            "Traceback.*:\n"
3429
 
            "(?:.*\n)*"
3430
 
            ".+ in fork_for_tests\n"
3431
 
            "(?:.*\n)*"
3432
 
            "\s*workaround_zealous_crypto_random\(\)\n"
3433
 
            "(?:.*\n)*"
3434
 
            "TypeError:")
3435
 
 
3436
 
 
3437
 
class TestUncollectedWarnings(_Selftest, tests.TestCase):
3438
 
    """Check a test case still alive after being run emits a warning"""
3439
 
 
3440
 
    class Test(tests.TestCase):
3441
 
        def test_pass(self):
3442
 
            pass
3443
 
        def test_self_ref(self):
3444
 
            self.also_self = self.test_self_ref
3445
 
        def test_skip(self):
3446
 
            self.skip("Don't need")
3447
 
 
3448
 
    def _get_suite(self):
3449
 
        return TestUtil.TestSuite([
3450
 
            self.Test("test_pass"),
3451
 
            self.Test("test_self_ref"),
3452
 
            self.Test("test_skip"),
3453
 
            ])
3454
 
 
3455
 
    def _run_selftest_with_suite(self, **kwargs):
3456
 
        old_flags = tests.selftest_debug_flags
3457
 
        tests.selftest_debug_flags = old_flags.union(["uncollected_cases"])
3458
 
        gc_on = gc.isenabled()
3459
 
        if gc_on:
3460
 
            gc.disable()
3461
 
        try:
3462
 
            output = self._run_selftest(test_suite_factory=self._get_suite,
3463
 
                **kwargs)
3464
 
        finally:
3465
 
            if gc_on:
3466
 
                gc.enable()
3467
 
            tests.selftest_debug_flags = old_flags
3468
 
        self.assertNotContainsRe(output, "Uncollected test case.*test_pass")
3469
 
        self.assertContainsRe(output, "Uncollected test case.*test_self_ref")
3470
 
        return output
3471
 
 
3472
 
    def test_testsuite(self):
3473
 
        self._run_selftest_with_suite()
3474
 
 
3475
 
    def test_pattern(self):
3476
 
        out = self._run_selftest_with_suite(pattern="test_(?:pass|self_ref)$")
3477
 
        self.assertNotContainsRe(out, "test_skip")
3478
 
 
3479
 
    def test_exclude_pattern(self):
3480
 
        out = self._run_selftest_with_suite(exclude_pattern="test_skip$")
3481
 
        self.assertNotContainsRe(out, "test_skip")
3482
 
 
3483
 
    def test_random_seed(self):
3484
 
        self._run_selftest_with_suite(random_seed="now")
3485
 
 
3486
 
    def test_matching_tests_first(self):
3487
 
        self._run_selftest_with_suite(matching_tests_first=True,
3488
 
            pattern="test_self_ref$")
3489
 
 
3490
 
    def test_starting_with_and_exclude(self):
3491
 
        out = self._run_selftest_with_suite(starting_with=["bt."],
3492
 
            exclude_pattern="test_skip$")
3493
 
        self.assertNotContainsRe(out, "test_skip")
3494
 
 
3495
 
    def test_additonal_decorator(self):
3496
 
        out = self._run_selftest_with_suite(
3497
 
            suite_decorators=[tests.TestDecorator])
3498
 
 
3499
 
 
3500
 
class TestUncollectedWarningsSubunit(TestUncollectedWarnings):
3501
 
    """Check warnings from tests staying alive are emitted with subunit"""
3502
 
 
3503
 
    _test_needs_features = [features.subunit]
3504
 
 
3505
 
    def _run_selftest_with_suite(self, **kwargs):
3506
 
        return TestUncollectedWarnings._run_selftest_with_suite(self,
3507
 
            runner_class=tests.SubUnitBzrRunner, **kwargs)
3508
 
 
3509
 
 
3510
 
class TestUncollectedWarningsForked(_ForkedSelftest, TestUncollectedWarnings):
3511
 
    """Check warnings from tests staying alive are emitted when forking"""
3512
 
 
3513
 
 
3514
3364
class TestEnvironHandling(tests.TestCase):
3515
3365
 
3516
3366
    def test_overrideEnv_None_called_twice_doesnt_leak(self):
3521
3371
            def test_me(self):
3522
3372
                # The first call save the 42 value
3523
3373
                self.overrideEnv('MYVAR', None)
3524
 
                self.assertEqual(None, os.environ.get('MYVAR'))
 
3374
                self.assertEquals(None, os.environ.get('MYVAR'))
3525
3375
                # Make sure we can call it twice
3526
3376
                self.overrideEnv('MYVAR', None)
3527
 
                self.assertEqual(None, os.environ.get('MYVAR'))
 
3377
                self.assertEquals(None, os.environ.get('MYVAR'))
3528
3378
        output = StringIO()
3529
3379
        result = tests.TextTestResult(output, 0, 1)
3530
3380
        Test('test_me').run(result)
3531
3381
        if not result.wasStrictlySuccessful():
3532
3382
            self.fail(output.getvalue())
3533
3383
        # We get our value back
3534
 
        self.assertEqual('42', os.environ.get('MYVAR'))
 
3384
        self.assertEquals('42', os.environ.get('MYVAR'))
3535
3385
 
3536
3386
 
3537
3387
class TestIsolatedEnv(tests.TestCase):
3553
3403
        # Make sure we know the definition of BZR_HOME: not part of os.environ
3554
3404
        # for tests.TestCase.
3555
3405
        self.assertTrue('BZR_HOME' in tests.isolated_environ)
3556
 
        self.assertEqual(None, tests.isolated_environ['BZR_HOME'])
 
3406
        self.assertEquals(None, tests.isolated_environ['BZR_HOME'])
3557
3407
        # Being part of isolated_environ, BZR_HOME should not appear here
3558
3408
        self.assertFalse('BZR_HOME' in os.environ)
3559
3409
        # Make sure we know the definition of LINES: part of os.environ for
3560
3410
        # tests.TestCase
3561
3411
        self.assertTrue('LINES' in tests.isolated_environ)
3562
 
        self.assertEqual('25', tests.isolated_environ['LINES'])
3563
 
        self.assertEqual('25', os.environ['LINES'])
 
3412
        self.assertEquals('25', tests.isolated_environ['LINES'])
 
3413
        self.assertEquals('25', os.environ['LINES'])
3564
3414
 
3565
3415
    def test_injecting_unknown_variable(self):
3566
3416
        # BZR_HOME is known to be absent from os.environ
3567
3417
        test = self.ScratchMonkey('test_me')
3568
3418
        tests.override_os_environ(test, {'BZR_HOME': 'foo'})
3569
 
        self.assertEqual('foo', os.environ['BZR_HOME'])
 
3419
        self.assertEquals('foo', os.environ['BZR_HOME'])
3570
3420
        tests.restore_os_environ(test)
3571
3421
        self.assertFalse('BZR_HOME' in os.environ)
3572
3422
 
3574
3424
        test = self.ScratchMonkey('test_me')
3575
3425
        # LINES is known to be present in os.environ
3576
3426
        tests.override_os_environ(test, {'LINES': '42'})
3577
 
        self.assertEqual('42', os.environ['LINES'])
 
3427
        self.assertEquals('42', os.environ['LINES'])
3578
3428
        tests.restore_os_environ(test)
3579
 
        self.assertEqual('25', os.environ['LINES'])
 
3429
        self.assertEquals('25', os.environ['LINES'])
3580
3430
 
3581
3431
    def test_deleting_variable(self):
3582
3432
        test = self.ScratchMonkey('test_me')
3584
3434
        tests.override_os_environ(test, {'LINES': None})
3585
3435
        self.assertTrue('LINES' not in os.environ)
3586
3436
        tests.restore_os_environ(test)
3587
 
        self.assertEqual('25', os.environ['LINES'])
 
3437
        self.assertEquals('25', os.environ['LINES'])
3588
3438
 
3589
3439
 
3590
3440
class TestDocTestSuiteIsolation(tests.TestCase):
3650
3500
        self.assertDocTestStringFails(doctest.DocTestSuite, test)
3651
3501
        # tests.DocTestSuite sees None
3652
3502
        self.assertDocTestStringSucceds(tests.IsolatedDocTestSuite, test)
3653
 
 
3654
 
 
3655
 
class TestSelftestExcludePatterns(tests.TestCase):
3656
 
 
3657
 
    def setUp(self):
3658
 
        super(TestSelftestExcludePatterns, self).setUp()
3659
 
        self.overrideAttr(tests, 'test_suite', self.suite_factory)
3660
 
 
3661
 
    def suite_factory(self, keep_only=None, starting_with=None):
3662
 
        """A test suite factory with only a few tests."""
3663
 
        class Test(tests.TestCase):
3664
 
            def id(self):
3665
 
                # We don't need the full class path
3666
 
                return self._testMethodName
3667
 
            def a(self):
3668
 
                pass
3669
 
            def b(self):
3670
 
                pass
3671
 
            def c(self):
3672
 
                pass
3673
 
        return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
3674
 
 
3675
 
    def assertTestList(self, expected, *selftest_args):
3676
 
        # We rely on setUp installing the right test suite factory so we can
3677
 
        # test at the command level without loading the whole test suite
3678
 
        out, err = self.run_bzr(('selftest', '--list') + selftest_args)
3679
 
        actual = out.splitlines()
3680
 
        self.assertEqual(expected, actual)
3681
 
 
3682
 
    def test_full_list(self):
3683
 
        self.assertTestList(['a', 'b', 'c'])
3684
 
 
3685
 
    def test_single_exclude(self):
3686
 
        self.assertTestList(['b', 'c'], '-x', 'a')
3687
 
 
3688
 
    def test_mutiple_excludes(self):
3689
 
        self.assertTestList(['c'], '-x', 'a', '-x', 'b')
3690
 
 
3691
 
 
3692
 
class TestCounterHooks(tests.TestCase, SelfTestHelper):
3693
 
 
3694
 
    _test_needs_features = [features.subunit]
3695
 
 
3696
 
    def setUp(self):
3697
 
        super(TestCounterHooks, self).setUp()
3698
 
        class Test(tests.TestCase):
3699
 
 
3700
 
            def setUp(self):
3701
 
                super(Test, self).setUp()
3702
 
                self.hooks = hooks.Hooks()
3703
 
                self.hooks.add_hook('myhook', 'Foo bar blah', (2,4))
3704
 
                self.install_counter_hook(self.hooks, 'myhook')
3705
 
 
3706
 
            def no_hook(self):
3707
 
                pass
3708
 
 
3709
 
            def run_hook_once(self):
3710
 
                for hook in self.hooks['myhook']:
3711
 
                    hook(self)
3712
 
 
3713
 
        self.test_class = Test
3714
 
 
3715
 
    def assertHookCalls(self, expected_calls, test_name):
3716
 
        test = self.test_class(test_name)
3717
 
        result = unittest.TestResult()
3718
 
        test.run(result)
3719
 
        self.assertTrue(hasattr(test, '_counters'))
3720
 
        self.assertTrue(test._counters.has_key('myhook'))
3721
 
        self.assertEqual(expected_calls, test._counters['myhook'])
3722
 
 
3723
 
    def test_no_hook(self):
3724
 
        self.assertHookCalls(0, 'no_hook')
3725
 
 
3726
 
    def test_run_hook_once(self):
3727
 
        tt = features.testtools
3728
 
        if tt.module.__version__ < (0, 9, 8):
3729
 
            raise tests.TestSkipped('testtools-0.9.8 required for addDetail')
3730
 
        self.assertHookCalls(1, 'run_hook_once')