~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Tarmac
  • Author(s): Vincent Ladeuil
  • Date: 2017-01-30 14:42:05 UTC
  • mfrom: (6620.1.1 trunk)
  • Revision ID: tarmac-20170130144205-r8fh2xpmiuxyozpv
Merge  2.7 into trunk including fix for bug #1657238 [r=vila]

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2013, 2016 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
20
21
import doctest
21
22
import os
22
23
import signal
29
30
from testtools import (
30
31
    ExtendedToOriginalDecorator,
31
32
    MultiTestResult,
32
 
    __version__ as testtools_version,
33
33
    )
34
34
from testtools.content import Content
35
35
from testtools.content_type import ContentType
43
43
from bzrlib import (
44
44
    branchbuilder,
45
45
    bzrdir,
 
46
    controldir,
46
47
    errors,
47
48
    hooks,
48
49
    lockdir,
334
335
        server1 = "a"
335
336
        server2 = "b"
336
337
        formats = [workingtree_4.WorkingTreeFormat4(),
337
 
                   workingtree_3.WorkingTreeFormat3(),]
338
 
        scenarios = make_scenarios(server1, server2, formats)
 
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')
339
343
        self.assertEqual([
340
344
            ('WorkingTreeFormat4',
341
345
             {'bzrdir_format': formats[0]._matchingbzrdir,
346
350
             {'bzrdir_format': formats[1]._matchingbzrdir,
347
351
              'transport_readonly_server': 'b',
348
352
              'transport_server': 'a',
349
 
              'workingtree_format': formats[1]})],
350
 
            scenarios)
 
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)
351
367
 
352
368
 
353
369
class TestTreeScenarios(tests.TestCase):
354
370
 
355
371
    def test_scenarios(self):
356
372
        # the tree implementation scenario generator is meant to setup one
357
 
        # instance for each working tree format, and one additional instance
 
373
        # instance for each working tree format, one additional instance
358
374
        # that will use the default wt format, but create a revision tree for
359
 
        # the tests.  this means that the wt ones should have the
360
 
        # workingtree_to_test_tree attribute set to 'return_parameter' and the
361
 
        # revision one set to revision_tree_from_workingtree.
 
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.
362
380
 
363
381
        from bzrlib.tests.per_tree import (
364
382
            _dirstate_tree_from_workingtree,
370
388
            )
371
389
        server1 = "a"
372
390
        server2 = "b"
 
391
        smart_server = test_server.SmartTCPServer_for_testing
 
392
        smart_readonly_server = test_server.ReadonlySmartTCPServer_for_testing
 
393
        mem_server = memory.MemoryServer
373
394
        formats = [workingtree_4.WorkingTreeFormat4(),
374
395
                   workingtree_3.WorkingTreeFormat3(),]
375
396
        scenarios = make_scenarios(server1, server2, formats)
376
 
        self.assertEqual(7, len(scenarios))
 
397
        self.assertEqual(8, len(scenarios))
377
398
        default_wt_format = workingtree.format_registry.get_default()
378
399
        wt4_format = workingtree_4.WorkingTreeFormat4()
379
400
        wt5_format = workingtree_4.WorkingTreeFormat5()
 
401
        wt6_format = workingtree_4.WorkingTreeFormat6()
380
402
        expected_scenarios = [
381
403
            ('WorkingTreeFormat4',
382
404
             {'bzrdir_format': formats[0]._matchingbzrdir,
392
414
              'workingtree_format': formats[1],
393
415
              '_workingtree_to_test_tree': return_parameter,
394
416
             }),
 
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
             }),
395
426
            ('RevisionTree',
396
427
             {'_workingtree_to_test_tree': revision_tree_from_workingtree,
397
428
              'bzrdir_format': default_wt_format._matchingbzrdir,
609
640
        # Guard against regression into MemoryTransport leaking
610
641
        # files to disk instead of keeping them in memory.
611
642
        self.assertFalse(osutils.lexists('dir'))
612
 
        dir_format = bzrdir.format_registry.make_bzrdir('knit')
 
643
        dir_format = controldir.format_registry.make_bzrdir('knit')
613
644
        self.assertEqual(dir_format.repository_format.__class__,
614
645
                         the_branch.repository._format.__class__)
615
646
        self.assertEqual('Bazaar-NG Knit Repository Format 1',
678
709
        builder = self.make_branch_builder('dir')
679
710
        rev_id = builder.build_commit()
680
711
        self.assertPathExists('dir')
681
 
        a_dir = bzrdir.BzrDir.open('dir')
 
712
        a_dir = controldir.ControlDir.open('dir')
682
713
        self.assertRaises(errors.NoWorkingTree, a_dir.open_workingtree)
683
714
        a_branch = a_dir.open_branch()
684
715
        builder_branch = builder.get_branch()
971
1002
            pass
972
1003
        test = unittest.FunctionTestCase(test_function)
973
1004
        test.run(result)
974
 
        self.assertEquals(1, result.calls)
 
1005
        self.assertEqual(1, result.calls)
975
1006
 
976
1007
    def test_startTests_only_once(self):
977
1008
        """With multiple tests startTests should still only be called once"""
983
1014
            unittest.FunctionTestCase(lambda: None),
984
1015
            unittest.FunctionTestCase(lambda: None)])
985
1016
        suite.run(result)
986
 
        self.assertEquals(1, result.calls)
987
 
        self.assertEquals(2, result.count)
 
1017
        self.assertEqual(1, result.calls)
 
1018
        self.assertEqual(2, result.count)
988
1019
 
989
1020
 
990
1021
class TestRunner(tests.TestCase):
1062
1093
                self.expectFailure("No absolute truth", self.assertTrue, True)
1063
1094
        runner = tests.TextTestRunner(stream=StringIO())
1064
1095
        result = self.run_test_runner(runner, Test("test_truth"))
1065
 
        if testtools_version[:3] <= (0, 9, 11):
1066
 
            self.assertContainsRe(runner.stream.getvalue(),
1067
 
                "=+\n"
1068
 
                "FAIL: \\S+\.test_truth\n"
1069
 
                "-+\n"
1070
 
                "(?:.*\n)*"
1071
 
                "No absolute truth\n"
1072
 
                "(?:.*\n)*"
1073
 
                "-+\n"
1074
 
                "Ran 1 test in .*\n"
1075
 
                "\n"
1076
 
                "FAILED \\(failures=1\\)\n\\Z")
1077
 
        else:
1078
 
            self.assertContainsRe(runner.stream.getvalue(),
1079
 
                "=+\n"
1080
 
                "FAIL: \\S+\.test_truth\n"
1081
 
                "-+\n"
1082
 
                "Empty attachments:\n"
1083
 
                "  log\n"
1084
 
                "\n"
1085
 
                "reason: {{{No absolute truth}}}\n"
1086
 
                "-+\n"
1087
 
                "Ran 1 test in .*\n"
1088
 
                "\n"
1089
 
                "FAILED \\(failures=1\\)\n\\Z")
 
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")
1090
1110
 
1091
1111
    def test_result_decorator(self):
1092
1112
        # decorate results
1141
1161
        class SkippedTest(tests.TestCase):
1142
1162
 
1143
1163
            def setUp(self):
1144
 
                tests.TestCase.setUp(self)
 
1164
                super(SkippedTest, self).setUp()
1145
1165
                calls.append('setUp')
1146
1166
                self.addCleanup(self.cleanup)
1147
1167
 
1251
1271
            lambda trace=False: "ascii")
1252
1272
        result = self.run_test_runner(tests.TextTestRunner(stream=out),
1253
1273
            FailureWithUnicode("test_log_unicode"))
1254
 
        if testtools_version[:3] > (0, 9, 11):
1255
 
            self.assertContainsRe(out.getvalue(), "log: {{{\d+\.\d+  \\\\u2606}}}")
1256
 
        else:
1257
 
            self.assertContainsRe(out.getvalue(),
1258
 
                "Text attachment: log\n"
1259
 
                "-+\n"
1260
 
                "\d+\.\d+  \\\\u2606\n"
1261
 
                "-+\n")
 
1274
        self.assertContainsRe(out.getvalue(),
 
1275
            "(?:Text attachment: )?log"
 
1276
            "(?:\n-+\n|: {{{)"
 
1277
            "\d+\.\d+  \\\\u2606"
 
1278
            "(?:\n-+\n|}}}\n)")
1262
1279
 
1263
1280
 
1264
1281
class SampleTestCase(tests.TestCase):
1491
1508
        transport_server.start_server()
1492
1509
        self.addCleanup(transport_server.stop_server)
1493
1510
        t = transport.get_transport_from_url(transport_server.get_url())
1494
 
        bzrdir.BzrDir.create(t.base)
 
1511
        controldir.ControlDir.create(t.base)
1495
1512
        self.assertRaises(errors.BzrError,
1496
 
            bzrdir.BzrDir.open_from_transport, t)
 
1513
            controldir.ControlDir.open_from_transport, t)
1497
1514
        # But if we declare this as safe, we can open the bzrdir.
1498
1515
        self.permit_url(t.base)
1499
1516
        self._bzr_selftest_roots.append(t.base)
1500
 
        bzrdir.BzrDir.open_from_transport(t)
 
1517
        controldir.ControlDir.open_from_transport(t)
1501
1518
 
1502
1519
    def test_requireFeature_available(self):
1503
1520
        """self.requireFeature(available) is a no-op."""
1637
1654
        self.assertRaises(AssertionError,
1638
1655
            self.assertListRaises, _TestException, success_generator)
1639
1656
 
 
1657
    def _run_successful_test(self, test):
 
1658
        result = testtools.TestResult()
 
1659
        test.run(result)
 
1660
        self.assertTrue(result.wasSuccessful())
 
1661
        return result
 
1662
 
1640
1663
    def test_overrideAttr_without_value(self):
1641
1664
        self.test_attr = 'original' # Define a test attribute
1642
1665
        obj = self # Make 'obj' visible to the embedded test
1643
1666
        class Test(tests.TestCase):
1644
1667
 
1645
1668
            def setUp(self):
1646
 
                tests.TestCase.setUp(self)
 
1669
                super(Test, self).setUp()
1647
1670
                self.orig = self.overrideAttr(obj, 'test_attr')
1648
1671
 
1649
1672
            def test_value(self):
1652
1675
                obj.test_attr = 'modified'
1653
1676
                self.assertEqual('modified', obj.test_attr)
1654
1677
 
1655
 
        test = Test('test_value')
1656
 
        test.run(unittest.TestResult())
 
1678
        self._run_successful_test(Test('test_value'))
1657
1679
        self.assertEqual('original', obj.test_attr)
1658
1680
 
1659
1681
    def test_overrideAttr_with_value(self):
1662
1684
        class Test(tests.TestCase):
1663
1685
 
1664
1686
            def setUp(self):
1665
 
                tests.TestCase.setUp(self)
 
1687
                super(Test, self).setUp()
1666
1688
                self.orig = self.overrideAttr(obj, 'test_attr', new='modified')
1667
1689
 
1668
1690
            def test_value(self):
1669
1691
                self.assertEqual('original', self.orig)
1670
1692
                self.assertEqual('modified', obj.test_attr)
1671
1693
 
1672
 
        test = Test('test_value')
1673
 
        test.run(unittest.TestResult())
 
1694
        self._run_successful_test(Test('test_value'))
1674
1695
        self.assertEqual('original', obj.test_attr)
1675
1696
 
 
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
 
1676
1729
    def test_recordCalls(self):
1677
1730
        from bzrlib.tests import test_selftest
1678
1731
        calls = self.recordCalls(
1679
1732
            test_selftest, '_add_numbers')
1680
1733
        self.assertEqual(test_selftest._add_numbers(2, 10),
1681
1734
            12)
1682
 
        self.assertEquals(calls, [((2, 10), {})])
 
1735
        self.assertEqual(calls, [((2, 10), {})])
1683
1736
 
1684
1737
 
1685
1738
def _add_numbers(a, b):
1743
1796
        result = self._run_test('test_fail')
1744
1797
        self.assertEqual(1, len(result.failures))
1745
1798
        result_content = result.failures[0][1]
1746
 
        if testtools_version < (0, 9, 12):
1747
 
            self.assertContainsRe(result_content, 'Text attachment: log')
 
1799
        self.assertContainsRe(result_content,
 
1800
            '(?m)^(?:Text attachment: )?log(?:$|: )')
1748
1801
        self.assertContainsRe(result_content, 'this was a failing test')
1749
1802
 
1750
1803
    def test_error_has_log(self):
1751
1804
        result = self._run_test('test_error')
1752
1805
        self.assertEqual(1, len(result.errors))
1753
1806
        result_content = result.errors[0][1]
1754
 
        if testtools_version < (0, 9, 12):
1755
 
            self.assertContainsRe(result_content, 'Text attachment: log')
 
1807
        self.assertContainsRe(result_content,
 
1808
            '(?m)^(?:Text attachment: )?log(?:$|: )')
1756
1809
        self.assertContainsRe(result_content, 'this test errored')
1757
1810
 
1758
1811
    def test_skip_has_no_log(self):
1777
1830
        result = self._run_test('test_xfail')
1778
1831
        self.assertEqual(1, len(result.expectedFailures))
1779
1832
        result_content = result.expectedFailures[0][1]
1780
 
        self.assertNotContainsRe(result_content, 'Text attachment: log')
 
1833
        self.assertNotContainsRe(result_content,
 
1834
            '(?m)^(?:Text attachment: )?log(?:$|: )')
1781
1835
        self.assertNotContainsRe(result_content, 'test with expected failure')
1782
1836
 
1783
1837
    def test_unexpected_success_has_log(self):
1858
1912
        self.assertIsInstance(2, int)
1859
1913
        self.assertIsInstance(u'', basestring)
1860
1914
        e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1861
 
        self.assertEquals(str(e),
 
1915
        self.assertEqual(str(e),
1862
1916
            "None is an instance of <type 'NoneType'> rather than <type 'int'>")
1863
1917
        self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1864
1918
        e = self.assertRaises(AssertionError,
1865
1919
            self.assertIsInstance, None, int, "it's just not")
1866
 
        self.assertEquals(str(e),
 
1920
        self.assertEqual(str(e),
1867
1921
            "None is an instance of <type 'NoneType'> rather than <type 'int'>"
1868
1922
            ": it's just not")
1869
1923
 
1874
1928
    def test_assertEqualDiff(self):
1875
1929
        e = self.assertRaises(AssertionError,
1876
1930
                              self.assertEqualDiff, '', '\n')
1877
 
        self.assertEquals(str(e),
 
1931
        self.assertEqual(str(e),
1878
1932
                          # Don't blink ! The '+' applies to the second string
1879
1933
                          'first string is missing a final newline.\n+ \n')
1880
1934
        e = self.assertRaises(AssertionError,
1881
1935
                              self.assertEqualDiff, '\n', '')
1882
 
        self.assertEquals(str(e),
 
1936
        self.assertEqual(str(e),
1883
1937
                          # Don't blink ! The '-' applies to the second string
1884
1938
                          'second string is missing a final newline.\n- \n')
1885
1939
 
1942
1996
            warnings.warn("this is your last warning")
1943
1997
            return a + b
1944
1998
        wlist, result = self.callCatchWarnings(meth, 1, 2)
1945
 
        self.assertEquals(3, result)
 
1999
        self.assertEqual(3, result)
1946
2000
        # would like just to compare them, but UserWarning doesn't implement
1947
2001
        # eq well
1948
2002
        w0, = wlist
1949
2003
        self.assertIsInstance(w0, UserWarning)
1950
 
        self.assertEquals("this is your last warning", str(w0))
 
2004
        self.assertEqual("this is your last warning", str(w0))
1951
2005
 
1952
2006
 
1953
2007
class TestConvenienceMakers(tests.TestCaseWithTransport):
1956
2010
    def test_make_branch_and_tree_with_format(self):
1957
2011
        # we should be able to supply a format to make_branch_and_tree
1958
2012
        self.make_branch_and_tree('a', format=bzrlib.bzrdir.BzrDirMetaFormat1())
1959
 
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('a')._format,
 
2013
        self.assertIsInstance(bzrlib.controldir.ControlDir.open('a')._format,
1960
2014
                              bzrlib.bzrdir.BzrDirMetaFormat1)
1961
2015
 
1962
2016
    def test_make_branch_and_memory_tree(self):
1974
2028
        tree = self.make_branch_and_tree('t1')
1975
2029
        base = tree.bzrdir.root_transport.base
1976
2030
        self.assertStartsWith(base, 'file://')
1977
 
        self.assertEquals(tree.bzrdir.root_transport,
 
2031
        self.assertEqual(tree.bzrdir.root_transport,
1978
2032
                tree.branch.bzrdir.root_transport)
1979
 
        self.assertEquals(tree.bzrdir.root_transport,
 
2033
        self.assertEqual(tree.bzrdir.root_transport,
1980
2034
                tree.branch.repository.bzrdir.root_transport)
1981
2035
 
1982
2036
 
2192
2246
        self.assertNotContainsRe(content, 'test with expected failure')
2193
2247
        self.assertEqual(1, len(result.expectedFailures))
2194
2248
        result_content = result.expectedFailures[0][1]
2195
 
        self.assertNotContainsRe(result_content, 'Text attachment: log')
 
2249
        self.assertNotContainsRe(result_content,
 
2250
            '(?m)^(?:Text attachment: )?log(?:$|: )')
2196
2251
        self.assertNotContainsRe(result_content, 'test with expected failure')
2197
2252
 
2198
2253
    def test_unexpected_success_has_log(self):
2245
2300
        self.assertEqual(['rocks'], self.argv)
2246
2301
        self.assertEqual(34, self.retcode)
2247
2302
        self.assertEqual('It sure does!\n', out)
2248
 
        self.assertEquals(out, self.out)
 
2303
        self.assertEqual(out, self.out)
2249
2304
        self.assertEqual('', err)
2250
 
        self.assertEquals(err, self.err)
 
2305
        self.assertEqual(err, self.err)
2251
2306
 
2252
2307
    def test_run_bzr_error_regexes(self):
2253
2308
        self.out = ''
2393
2448
    """Base class for tests testing how we might run bzr."""
2394
2449
 
2395
2450
    def setUp(self):
2396
 
        tests.TestCaseWithTransport.setUp(self)
 
2451
        super(TestWithFakedStartBzrSubprocess, self).setUp()
2397
2452
        self.subprocess_calls = []
2398
2453
 
2399
2454
    def start_bzr_subprocess(self, process_args, env_changes=None,
2613
2668
class TestSelftestFiltering(tests.TestCase):
2614
2669
 
2615
2670
    def setUp(self):
2616
 
        tests.TestCase.setUp(self)
 
2671
        super(TestSelftestFiltering, self).setUp()
2617
2672
        self.suite = TestUtil.TestSuite()
2618
2673
        self.loader = TestUtil.TestLoader()
2619
2674
        self.suite.addTest(self.loader.loadTestsFromModule(
2792
2847
            self.run_bzr, ['assert-fail'])
2793
2848
        # make sure we got the real thing, not an error from somewhere else in
2794
2849
        # the test framework
2795
 
        self.assertEquals('always fails', str(e))
 
2850
        self.assertEqual('always fails', str(e))
2796
2851
        # check that there's no traceback in the test log
2797
2852
        self.assertNotContainsRe(self.get_log(), r'Traceback')
2798
2853
 
2847
2902
    def test_load_tests_from_module_name_smoke_test(self):
2848
2903
        loader = TestUtil.TestLoader()
2849
2904
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2850
 
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
 
2905
        self.assertEqual(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
2851
2906
                          _test_ids(suite))
2852
2907
 
2853
2908
    def test_load_tests_from_module_name_with_bogus_module_name(self):
2882
2937
 
2883
2938
    def test_empty_list(self):
2884
2939
        id_list = self._create_id_list([])
2885
 
        self.assertEquals({}, id_list.tests)
2886
 
        self.assertEquals({}, id_list.modules)
 
2940
        self.assertEqual({}, id_list.tests)
 
2941
        self.assertEqual({}, id_list.modules)
2887
2942
 
2888
2943
    def test_valid_list(self):
2889
2944
        id_list = self._create_id_list(
2916
2971
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',
2917
2972
                     'bogus']
2918
2973
        not_found, duplicates = tests.suite_matches_id_list(suite, test_list)
2919
 
        self.assertEquals(['bogus'], not_found)
2920
 
        self.assertEquals([], duplicates)
 
2974
        self.assertEqual(['bogus'], not_found)
 
2975
        self.assertEqual([], duplicates)
2921
2976
 
2922
2977
    def test_suite_matches_id_list_with_duplicates(self):
2923
2978
        loader = TestUtil.TestLoader()
2930
2985
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',]
2931
2986
        not_found, duplicates = tests.suite_matches_id_list(
2932
2987
            dupes, test_list)
2933
 
        self.assertEquals([], not_found)
2934
 
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
 
2988
        self.assertEqual([], not_found)
 
2989
        self.assertEqual(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
2935
2990
                          duplicates)
2936
2991
 
2937
2992
 
3010
3065
        suite = tests.test_suite(test_list,
3011
3066
                                 ['bzrlib.tests.test_selftest.TestTestSuite'])
3012
3067
        # test_test_suite_list_and_start is not included 
3013
 
        self.assertEquals(test_list, _test_ids(suite))
 
3068
        self.assertEqual(test_list, _test_ids(suite))
3014
3069
 
3015
3070
 
3016
3071
class TestLoadTestIdList(tests.TestCaseInTempDir):
3029
3084
        self._create_test_list_file(test_list_fname,
3030
3085
                                    'mod1.cl1.meth1\nmod2.cl2.meth2\n')
3031
3086
        tlist = tests.load_test_id_list(test_list_fname)
3032
 
        self.assertEquals(2, len(tlist))
3033
 
        self.assertEquals('mod1.cl1.meth1', tlist[0])
3034
 
        self.assertEquals('mod2.cl2.meth2', tlist[1])
 
3087
        self.assertEqual(2, len(tlist))
 
3088
        self.assertEqual('mod1.cl1.meth1', tlist[0])
 
3089
        self.assertEqual('mod2.cl2.meth2', tlist[1])
3035
3090
 
3036
3091
    def test_load_dirty_file(self):
3037
3092
        test_list_fname = 'test.list'
3039
3094
                                    '  mod1.cl1.meth1\n\nmod2.cl2.meth2  \n'
3040
3095
                                    'bar baz\n')
3041
3096
        tlist = tests.load_test_id_list(test_list_fname)
3042
 
        self.assertEquals(4, len(tlist))
3043
 
        self.assertEquals('mod1.cl1.meth1', tlist[0])
3044
 
        self.assertEquals('', tlist[1])
3045
 
        self.assertEquals('mod2.cl2.meth2', tlist[2])
3046
 
        self.assertEquals('bar baz', tlist[3])
 
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])
3047
3102
 
3048
3103
 
3049
3104
class TestFilteredByModuleTestLoader(tests.TestCase):
3057
3112
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
3058
3113
        loader = self._create_loader(test_list)
3059
3114
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3060
 
        self.assertEquals(test_list, _test_ids(suite))
 
3115
        self.assertEqual(test_list, _test_ids(suite))
3061
3116
 
3062
3117
    def test_exclude_tests(self):
3063
3118
        test_list = ['bogus']
3064
3119
        loader = self._create_loader(test_list)
3065
3120
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3066
 
        self.assertEquals([], _test_ids(suite))
 
3121
        self.assertEqual([], _test_ids(suite))
3067
3122
 
3068
3123
 
3069
3124
class TestFilteredByNameStartTestLoader(tests.TestCase):
3079
3134
        loader = self._create_loader('bzrlib.tests.test_samp')
3080
3135
 
3081
3136
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3082
 
        self.assertEquals(test_list, _test_ids(suite))
 
3137
        self.assertEqual(test_list, _test_ids(suite))
3083
3138
 
3084
3139
    def test_load_tests_inside_module(self):
3085
3140
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
3086
3141
        loader = self._create_loader('bzrlib.tests.test_sampler.Demo')
3087
3142
 
3088
3143
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3089
 
        self.assertEquals(test_list, _test_ids(suite))
 
3144
        self.assertEqual(test_list, _test_ids(suite))
3090
3145
 
3091
3146
    def test_exclude_tests(self):
3092
3147
        test_list = ['bogus']
3093
3148
        loader = self._create_loader('bogus')
3094
3149
 
3095
3150
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3096
 
        self.assertEquals([], _test_ids(suite))
 
3151
        self.assertEqual([], _test_ids(suite))
3097
3152
 
3098
3153
 
3099
3154
class TestTestPrefixRegistry(tests.TestCase):
3105
3160
    def test_register_new_prefix(self):
3106
3161
        tpr = self._get_registry()
3107
3162
        tpr.register('foo', 'fff.ooo.ooo')
3108
 
        self.assertEquals('fff.ooo.ooo', tpr.get('foo'))
 
3163
        self.assertEqual('fff.ooo.ooo', tpr.get('foo'))
3109
3164
 
3110
3165
    def test_register_existing_prefix(self):
3111
3166
        tpr = self._get_registry()
3112
3167
        tpr.register('bar', 'bbb.aaa.rrr')
3113
3168
        tpr.register('bar', 'bBB.aAA.rRR')
3114
 
        self.assertEquals('bbb.aaa.rrr', tpr.get('bar'))
 
3169
        self.assertEqual('bbb.aaa.rrr', tpr.get('bar'))
3115
3170
        self.assertThat(self.get_log(),
3116
3171
            DocTestMatches("...bar...bbb.aaa.rrr...BB.aAA.rRR",
3117
3172
                           doctest.ELLIPSIS))
3123
3178
    def test_resolve_prefix(self):
3124
3179
        tpr = self._get_registry()
3125
3180
        tpr.register('bar', 'bb.aa.rr')
3126
 
        self.assertEquals('bb.aa.rr', tpr.resolve_alias('bar'))
 
3181
        self.assertEqual('bb.aa.rr', tpr.resolve_alias('bar'))
3127
3182
 
3128
3183
    def test_resolve_unknown_alias(self):
3129
3184
        tpr = self._get_registry()
3132
3187
 
3133
3188
    def test_predefined_prefixes(self):
3134
3189
        tpr = tests.test_prefix_alias_registry
3135
 
        self.assertEquals('bzrlib', tpr.resolve_alias('bzrlib'))
3136
 
        self.assertEquals('bzrlib.doc', tpr.resolve_alias('bd'))
3137
 
        self.assertEquals('bzrlib.utils', tpr.resolve_alias('bu'))
3138
 
        self.assertEquals('bzrlib.tests', tpr.resolve_alias('bt'))
3139
 
        self.assertEquals('bzrlib.tests.blackbox', tpr.resolve_alias('bb'))
3140
 
        self.assertEquals('bzrlib.plugins', tpr.resolve_alias('bp'))
 
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'))
3141
3196
 
3142
3197
 
3143
3198
class TestThreadLeakDetection(tests.TestCase):
3314
3369
        self.assertLength(1, calls)
3315
3370
 
3316
3371
 
 
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
 
3317
3514
class TestEnvironHandling(tests.TestCase):
3318
3515
 
3319
3516
    def test_overrideEnv_None_called_twice_doesnt_leak(self):
3324
3521
            def test_me(self):
3325
3522
                # The first call save the 42 value
3326
3523
                self.overrideEnv('MYVAR', None)
3327
 
                self.assertEquals(None, os.environ.get('MYVAR'))
 
3524
                self.assertEqual(None, os.environ.get('MYVAR'))
3328
3525
                # Make sure we can call it twice
3329
3526
                self.overrideEnv('MYVAR', None)
3330
 
                self.assertEquals(None, os.environ.get('MYVAR'))
 
3527
                self.assertEqual(None, os.environ.get('MYVAR'))
3331
3528
        output = StringIO()
3332
3529
        result = tests.TextTestResult(output, 0, 1)
3333
3530
        Test('test_me').run(result)
3334
3531
        if not result.wasStrictlySuccessful():
3335
3532
            self.fail(output.getvalue())
3336
3533
        # We get our value back
3337
 
        self.assertEquals('42', os.environ.get('MYVAR'))
 
3534
        self.assertEqual('42', os.environ.get('MYVAR'))
3338
3535
 
3339
3536
 
3340
3537
class TestIsolatedEnv(tests.TestCase):
3356
3553
        # Make sure we know the definition of BZR_HOME: not part of os.environ
3357
3554
        # for tests.TestCase.
3358
3555
        self.assertTrue('BZR_HOME' in tests.isolated_environ)
3359
 
        self.assertEquals(None, tests.isolated_environ['BZR_HOME'])
 
3556
        self.assertEqual(None, tests.isolated_environ['BZR_HOME'])
3360
3557
        # Being part of isolated_environ, BZR_HOME should not appear here
3361
3558
        self.assertFalse('BZR_HOME' in os.environ)
3362
3559
        # Make sure we know the definition of LINES: part of os.environ for
3363
3560
        # tests.TestCase
3364
3561
        self.assertTrue('LINES' in tests.isolated_environ)
3365
 
        self.assertEquals('25', tests.isolated_environ['LINES'])
3366
 
        self.assertEquals('25', os.environ['LINES'])
 
3562
        self.assertEqual('25', tests.isolated_environ['LINES'])
 
3563
        self.assertEqual('25', os.environ['LINES'])
3367
3564
 
3368
3565
    def test_injecting_unknown_variable(self):
3369
3566
        # BZR_HOME is known to be absent from os.environ
3370
3567
        test = self.ScratchMonkey('test_me')
3371
3568
        tests.override_os_environ(test, {'BZR_HOME': 'foo'})
3372
 
        self.assertEquals('foo', os.environ['BZR_HOME'])
 
3569
        self.assertEqual('foo', os.environ['BZR_HOME'])
3373
3570
        tests.restore_os_environ(test)
3374
3571
        self.assertFalse('BZR_HOME' in os.environ)
3375
3572
 
3377
3574
        test = self.ScratchMonkey('test_me')
3378
3575
        # LINES is known to be present in os.environ
3379
3576
        tests.override_os_environ(test, {'LINES': '42'})
3380
 
        self.assertEquals('42', os.environ['LINES'])
 
3577
        self.assertEqual('42', os.environ['LINES'])
3381
3578
        tests.restore_os_environ(test)
3382
 
        self.assertEquals('25', os.environ['LINES'])
 
3579
        self.assertEqual('25', os.environ['LINES'])
3383
3580
 
3384
3581
    def test_deleting_variable(self):
3385
3582
        test = self.ScratchMonkey('test_me')
3387
3584
        tests.override_os_environ(test, {'LINES': None})
3388
3585
        self.assertTrue('LINES' not in os.environ)
3389
3586
        tests.restore_os_environ(test)
3390
 
        self.assertEquals('25', os.environ['LINES'])
 
3587
        self.assertEqual('25', os.environ['LINES'])
3391
3588
 
3392
3589
 
3393
3590
class TestDocTestSuiteIsolation(tests.TestCase):
3480
3677
        # test at the command level without loading the whole test suite
3481
3678
        out, err = self.run_bzr(('selftest', '--list') + selftest_args)
3482
3679
        actual = out.splitlines()
3483
 
        self.assertEquals(expected, actual)
 
3680
        self.assertEqual(expected, actual)
3484
3681
 
3485
3682
    def test_full_list(self):
3486
3683
        self.assertTestList(['a', 'b', 'c'])
3521
3718
        test.run(result)
3522
3719
        self.assertTrue(hasattr(test, '_counters'))
3523
3720
        self.assertTrue(test._counters.has_key('myhook'))
3524
 
        self.assertEquals(expected_calls, test._counters['myhook'])
 
3721
        self.assertEqual(expected_calls, test._counters['myhook'])
3525
3722
 
3526
3723
    def test_no_hook(self):
3527
3724
        self.assertHookCalls(0, 'no_hook')